package com.k_int.aggr2.mimsy.data.hdo;


import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.JoinColumn;

import org.hibernate.Session;

import com.k_int.aggr2.mimsy.data.util.MimsyHelper;
import com.k_int.mimsy.ref.MimsyDataTypeEnum;
import com.k_int.mimsy.ref.ObjectConformanceEnum;
import com.k_int.mimsy.ref.RecordTypeEnum;


@Entity
@Table(name="MIMSY_OBJECT_DATA")
@PrimaryKeyJoinColumn(name="BASE_DATA_FK")
public class MimsyObjectDataHDO extends BaseMimsyDataHDO //implements Serializable
{
    private static final long 			serialVersionUID    = 1L;
    private Set<TextTypePairHDO>      		other_numbers       = new HashSet<TextTypePairHDO>();    
    private RecordTypeEnum              record_type;  
   // private String 						name;
    private Integer                     item_count;			  
    private String                      section;  
    private Set<NameHDO>      				names         		= new HashSet<NameHDO>();  
    private Set<StringReplacementHDO>      			boroughs         	= new HashSet<StringReplacementHDO>();  
    private Set<NameHDO>      				functional_classification         		= new HashSet<NameHDO>();  
    private String                      title;
    private Set<TitleHDO>                 	other_titles        = new HashSet<TitleHDO>();
    private String                      publisher;
    private String                      pagination;
    private String                      site;
    private Set<StringReplacementHDO>                 materials 			= new HashSet<StringReplacementHDO>();
    private StringReplacementHDO		primary_material;
    private String                      measurements;
    private Set<DescriptionHDO>            descriptions        = new HashSet<DescriptionHDO>();
    private String                      acquisition;
    private String                      credit_line;
    private String                      owner_status;
    private String                      permanent_location;
    private LocationHDO					current_location;
    private Boolean                     loan_allowed;
    private String                      project_notes;  
    private String                      intended_use;    
    private String                      conservation_action;    
    private Set<StringReplacementHDO>                 project_codes		= new HashSet<StringReplacementHDO>();    
    private Set<ObjectReferenceHDO>    linked_objects 			= new HashSet<ObjectReferenceHDO>();
    private Set<PlaceReferenceHDO>    linked_places       	= new HashSet<PlaceReferenceHDO>();
    private Set<AgentReferenceHDO>    linked_agents       	= new HashSet<AgentReferenceHDO>();
    private Set<EventReferenceHDO>    linked_events       	= new HashSet<EventReferenceHDO>();
    private Set<MediaReferenceHDO>         linked_media        	= new HashSet<MediaReferenceHDO>();
    private Set<PublicationReferenceHDO>  	linked_publications = new HashSet<PublicationReferenceHDO>();
    private Set<SubjectReferenceHDO>    linked_subjects     	= new HashSet<SubjectReferenceHDO>(); 
    private Set<SiteReferenceHDO>    linked_sites     	= new HashSet<SiteReferenceHDO>();   
    private Set<MakerReferenceHDO>    makers     			= new HashSet<MakerReferenceHDO>();    
    private Set<CollectorReferenceHDO>    collectors    		= new HashSet<CollectorReferenceHDO>();   
    private Set<MimsyDateHDO>			    made 				= new HashSet<MimsyDateHDO>();
    private Set<MimsyDateHDO>			    collected 			= new HashSet<MimsyDateHDO>();   
    private String                      additional_information;
    private RightsHDO                 rights;  
    private String 						note;
   // private Set<StringReplacementHDO> 				maker 				= new HashSet<StringReplacementHDO>();
   // private Set<StringReplacementHDO> 				collector 			= new HashSet<StringReplacementHDO>();    
    private String 						place_made;
    private String 						place_collected;
    private String 						summary;
    private String						object_id;
   // private String 						summary_title;
    private String						display_date;
 
    /*private MimsyObjectDataHDO(String mimsy_id, String object_id, ObjectConformanceEnum conformance, Date last_updated)
    {
        super(mimsy_id,MimsyDataTypeEnum.OBJECT,last_updated,conformance);
    	this.object_id=object_id;
        if(mimsy_id==null || object_id==null || conformance==null || last_updated==null)
        	throw new NullPointerException("No null values allowed in constructor");       
    }*/
    
    protected MimsyObjectDataHDO()
    {;}
    
    public void setObjectId(String object_id)
    {
    	this.object_id=object_id;
    }
    
    @Column(name="OBJECT_ID", length=255)
    public String getObjectId()
    {
    	return object_id;
    }
  
    @OneToMany(cascade=CascadeType.ALL)
	 @JoinTable(name="MIMSY_OBJECT_NUMBER_LINK",
	         joinColumns=@JoinColumn(name="OBJECT_FK", referencedColumnName="ID"),
	         inverseJoinColumns= @JoinColumn(name="NUMBER_FK", referencedColumnName="ID"))
    public Set<TextTypePairHDO> getOtherNumbers()
    {
        return other_numbers;
    }

    public void setOtherNumbers(Set<TextTypePairHDO> other_numbers)
    {
        this.other_numbers = other_numbers;
    }

	@Column(name="OBJ_RECORD_TYPE")
	@Enumerated(EnumType.ORDINAL)
    public RecordTypeEnum getRecordType()
    {
        return record_type;
    }

    public void setRecordType(RecordTypeEnum record_type)
    {
        this.record_type = record_type;
    }

    @Column(name="OBJ_ITEM_COUNT")
    public Integer getItemCount()
    {
        return item_count;
    }

    public void setItemCount(Integer item_count)
    {
        this.item_count = item_count;
    }

	@Column(name="OBJ_SECTION")
    public String getSection()
    {
        return section;
    }


    public void setSection(String section)
    {
        this.section = section;
    }
    
   /* public void setName(String name)
    {
    	this.name=name;
    }
    
	@Column(name="OBJ_NAME")
    public String getName()
    {
    	return name;
    }*/

	@OneToMany(cascade=CascadeType.ALL)
	 @JoinTable(name="MIMSY_OBJECT_NAME_LINK",
	         joinColumns=@JoinColumn(name="OBJECT_FK", referencedColumnName="ID"),
	         inverseJoinColumns= @JoinColumn(name="NAME_FK", referencedColumnName="ID"))
    public Set<NameHDO> getNames()
    {
        return names;
    }

    public void setNames(Set<NameHDO> other_names)
    {
        this.names = other_names;
    }
    
	
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_BOROUGH_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "BOROUGH_FK") })
    public Set<StringReplacementHDO> getBoroughs()
    {
        return boroughs;
    }

    public void setBoroughs(Set<StringReplacementHDO> boroughs)
    {
        this.boroughs = boroughs;
    }
    
    @OneToMany(cascade=CascadeType.ALL)
	 @JoinTable(name="MIMSY_OBJECT_FNCLASS_LINK",
	         joinColumns=@JoinColumn(name="OBJECT_FK", referencedColumnName="ID"),
	         inverseJoinColumns= @JoinColumn(name="FNCLASS_FK", referencedColumnName="ID"))
    public Set<NameHDO> getFunctionalClassification()
    {
        return functional_classification;
    }

    public void setFunctionalClassification(Set<NameHDO> functional_classification)
    {
        this.functional_classification = functional_classification;
    }

    @Column(name="OBJ_TITLE", length=1000)
    public String getTitle()
    {
        return title;
    }

    //TITLE
    public void setTitle(String title)
    {
        this.title = title;
    }
    
    @OneToMany(cascade=CascadeType.ALL)
	 @JoinTable(name="MIMSY_OBJECT_TITLE_LINK",
	         joinColumns=@JoinColumn(name="OBJECT_FK", referencedColumnName="ID"),
	         inverseJoinColumns= @JoinColumn(name="TITLE_FK", referencedColumnName="ID"))
    public Set<TitleHDO> getOtherTitles()
    {
        return other_titles;
    }

    public void setOtherTitles(Set<TitleHDO> other_titles)
    {
        this.other_titles = other_titles;
    }

	@Column(name="OBJ_PUBLISHER")
    public String getPublisher()
    {
        return publisher;
    }

    //OPTION5
    public void setPublisher(String publisher)
    {
        this.publisher = publisher;
    }

	@Column(name="OBJ_PAGINATION")
    public String getPagination()
    {
        return pagination;
    }

    //OPTION6
    public void setPagination(String pagination)
    {
        this.pagination = pagination;
    }
    
	@Column(name="SITE")
    public String getSite()
    {
        return site;
    }


    public void setSite(String site)
    {
        this.site = site;
    }


    @OneToMany(cascade=CascadeType.ALL)
	 @JoinTable(name="MIMSY_OBJECT_MATERIAL_LINK",
	         joinColumns=@JoinColumn(name="OBJECT_FK", referencedColumnName="ID"),
	         inverseJoinColumns= @JoinColumn(name="MATERIAL_FK", referencedColumnName="ID"))
    public Set<StringReplacementHDO> getMaterials()
    {
        return materials;
    }
   
    public void setMaterials(Set<StringReplacementHDO> materials)
    {
        this.materials = materials;
    }
    
    public void setPrimaryMaterial(StringReplacementHDO primary_material)
    {
    	this.primary_material=primary_material;
    }
    
    @OneToOne(cascade=CascadeType.ALL)
    public StringReplacementHDO getPrimaryMaterial()
    {
    	return primary_material;
    }
        
    @Column(name="MEASUREMENTS", length=800)
    public String getMeasurements()
    {
        return measurements;
    }
   
    public void setMeasurements(String measurements)
    {
        this.measurements = measurements;
    }
        
	@Column(name="NOTE")
    public String getNote()
    {
        return note;
    }
 
    public void setNote(String note)
    {
        this.note=note ;
    }


	@Column(name="ACQUISITION")
    public String getAcquisition()
    {
        return acquisition;
    }

    // OPTION 7
    public void setAcquisition(String acquisition)
    {
        this.acquisition = acquisition;
    }

	@Column(name="CREDIT_LINE")
    public String getCreditLine()
    {
        return credit_line;
    }

    public void setCreditLine(String credit_line)
    {
        this.credit_line = credit_line;
    }

	@Column(name="OWNER_STATUS")
    public String getOwnerStatus()
    {
        return owner_status;
    }

    //LEGAL_STATUS
    public void setOwnerStatus(String owner_status)
    {
        this.owner_status = owner_status;
    }

	@Column(name="PERMANENT_LOCATION")
    public String getPermanentLocation()
    {
        return permanent_location;
    }

    //HOME_LOCATION
    public void setPermanentLocation(String permanent_location)
    {
        this.permanent_location = permanent_location;
    }
    
    @ManyToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="LOCATION_FK")
    public LocationHDO getCurrentLocation()
    {
        return current_location;
    }
    
    public void setCurrentLocation(LocationHDO current_location)
    {
    	this.current_location=current_location;
    }

    @Column(name="LOAN_ALLOWED")
    public Boolean isLoanAllowed() {
        return loan_allowed;
    }

    public void setLoanAllowed(Boolean loan_allowed)
    {
        this.loan_allowed = loan_allowed;
    }

	@Column(name="PROJECT_NOTES", length=4000)
	@Lob
    public String getProjectNotes()
    {
        return project_notes;
    }

    //OPTION1
    public void setProjectNotes(String project_notes)
    {
        this.project_notes = project_notes;
    }

	@Column(name="INTENDED_USE")
    public String getIntendedUse()
    {
        return intended_use;
    }

    //OPTION2
    public void setIntendedUse(String intended_use)
    {
        this.intended_use = intended_use;
    }

	@Column(name="CONSERVATION_ACTION")
    public String getConservationAction()
    {
        return conservation_action;
    }

    //OPTION 3
    public void setConservationAction(String conservation_action)
    {
        this.conservation_action = conservation_action;
    }

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_PR_CODE_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "PROJECT_CODE_FK") })
    public Set<StringReplacementHDO> getProjectCodes()
    {
        return project_codes;
    }

    //OPTION4
    public void setProjectCodes(Set<StringReplacementHDO> project_codes)
    {
        this.project_codes = project_codes;
    }

    //ITEMS_PLACES.*    
   /* @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_PLACE_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "PLACE_FK") })*/
    @OneToMany(cascade=CascadeType.ALL, mappedBy="owner",fetch=FetchType.EAGER)
    public Set<PlaceReferenceHDO> getLinkedPlaces()
    {
        return linked_places;
    }

    public void setLinkedPlaces(Set<PlaceReferenceHDO> linked_places)
    {
        this.linked_places = linked_places;
    }
    
    //ITEMS_SITES.*    
   /* @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_SITE_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "SITE_FK") })*/
    @OneToMany(cascade=CascadeType.ALL, mappedBy="owner",fetch=FetchType.EAGER)
    public Set<SiteReferenceHDO> getLinkedSites()
    {
        return linked_sites;
    }

    public void setLinkedSites(Set<SiteReferenceHDO> linked_sites)
    {
        this.linked_sites = linked_sites;
    }

   /* @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_AGENT_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "AGENT_FK") })*/
    @OneToMany(cascade=CascadeType.ALL, mappedBy="owner",fetch=FetchType.EAGER)
    public Set<AgentReferenceHDO> getLinkedAgents()
    {
        return linked_agents;
    }

    //ITEMS_PEOPLE.*
    public void setLinkedAgents(Set<AgentReferenceHDO> linked_people)
    {
        this.linked_agents = linked_people;
    }

    /*@OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_EVENT_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "EVENT_FK") })*/
    @OneToMany(cascade=CascadeType.ALL, mappedBy="owner",fetch=FetchType.EAGER)
    public Set<EventReferenceHDO> getLinkedEvents()
    {
        return linked_events;
    }

    //ITEMS_EVENTS.*
    public void setLinkedEvents(Set<EventReferenceHDO> linked_events)
    {
        this.linked_events = linked_events;
    }

    /*@OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_PUB_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "PUB_FK") })*/
    @OneToMany(cascade=CascadeType.ALL, mappedBy="owner",fetch=FetchType.EAGER)
    public Set<PublicationReferenceHDO> getLinkedPublications()
    {
        return linked_publications;
    }

    //ITEMS_PUBLICATIONS.*
    public void setLinkedPublications(
            Set<PublicationReferenceHDO> linked_publications)
    {
        this.linked_publications = linked_publications;
    }

   /* @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_SUBJ_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "SUBJ_FK") })*/
    @OneToMany(cascade=CascadeType.ALL, mappedBy="owner",fetch=FetchType.EAGER)
    public Set<SubjectReferenceHDO> getLinkedSubjects()
    {
        return linked_subjects;
    }

    //ITEMS_SUBJECTS
    public void setLinkedSubjects(Set<SubjectReferenceHDO> linked_subjects)
    {
        this.linked_subjects = linked_subjects;
    }

	@Column(name="ADDITIONAL_INFORMATION")
    public String getAdditionalInformation()
    {
        return additional_information;
    }

    //OFFSITE
    public void setAdditionalInformation(String additional_information)
    {
        this.additional_information = additional_information;
    }

    @OneToMany(cascade=CascadeType.ALL)
	 @JoinTable(name="MIMSY_OBJECT_DESCRIPTION_LINK",
	         joinColumns=@JoinColumn(name="OBJECT_FK", referencedColumnName="ID"),
	         inverseJoinColumns= @JoinColumn(name="DESCRIPTION_FK", referencedColumnName="ID"))
    public Set<DescriptionHDO> getDescriptions()
    {
        return descriptions;
    }
    
    // DESCRIPTION
    public void setSummary(String summary)
    {
    	this.summary=summary;
    }
    
    @Column(name="DESCRIPTION", length=4000)
    @Lob
    public String getSummary()
    {
    	return summary;
    }


    //ITEM_DESCRIPTIONS
    public void setDescriptions(Set<DescriptionHDO> descriptions)
    {
        this.descriptions = descriptions;
    }
    
    
    @OneToMany(cascade=CascadeType.ALL, mappedBy="owner",fetch=FetchType.EAGER)
    public Set<MediaReferenceHDO> getLinkedMedia()
    {
        return linked_media;
    }


    //ITEMS_MEDIA.MEDIA - maybe needs more!
    public void setLinkedMedia(Set<MediaReferenceHDO> linked_media)
    {
        this.linked_media = linked_media;
    }

    /*@OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_OBJECT_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK",referencedColumnName="ID") }, 
    		inverseJoinColumns = { @JoinColumn(name = "LINKED_OBJ_FK",referencedColumnName="ID") })*/
    @OneToMany(cascade=CascadeType.ALL, mappedBy="owner",fetch=FetchType.EAGER)
    public Set<ObjectReferenceHDO> getLinkedObjects()
    {
        return linked_objects;
    }

    //RELATED_ITEMS.*
    public void setLinkedObjects(Set<ObjectReferenceHDO> linked_objects)
    {
        this.linked_objects = linked_objects;
    }

   /* @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_MAKER_STR_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "MAKER_FK") })
    public Set<StringReplacementHDO> getMakerNames()
    {
        return maker;
    }

    //MAKER
    public void setMakerNames(Set<StringReplacementHDO> maker)
    {
        this.maker = maker;
    }*/
    
    
    @Column(name="PLACE_MADE")
    public String getPlaceMade()
    {
        return place_made;
    }

    
    public void setPlaceMade(String place_made)
    {
        this.place_made=place_made;;
    }
    
   /* @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_MAKER_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "MAKER_FK") })*/
    @OneToMany(cascade=CascadeType.ALL, mappedBy="owner",fetch=FetchType.EAGER)
    public Set<MakerReferenceHDO> getLinkedMakers()
    {
        return makers;
    }

    //ITEMS_MAKERS.*
    public void setLinkedMakers(
            Set<MakerReferenceHDO> makers)
    {
        this.makers = makers;
    }
     

    //COLLECTOR
    
   /* public void setCollectorNames(Set<StringReplacementHDO> collector)
    {
        this.collector = collector;
    }
    
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_COLLECTOR_STR_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK") }, 
    		inverseJoinColumns = { @JoinColumn(name = "COLLECTOR_FK") })
    public Set<StringReplacementHDO> getCollectorNames()
    {
    	return collector;
    }*/
    
    @Column(name="PLACE_COLLECTED")
    public String getPlaceCollected()
    {
        return place_collected;
    }

    //PLACE_COLLECTED
    public void setPlaceCollected(String place_collected)
    {
        this.place_collected=place_collected;
    }
    
   /* @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_COLLECTOR_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK",referencedColumnName="ID") }, 
    		inverseJoinColumns = { @JoinColumn(name = "COLLECTOR_FK",referencedColumnName="ID") })*/
    @OneToMany(cascade=CascadeType.ALL, mappedBy="owner",fetch=FetchType.EAGER)
    public Set<CollectorReferenceHDO> getLinkedCollectors()
    {
        return collectors;
    }

    //ITEMS_COLLECTORS.*
    public void setLinkedCollectors(
            Set<CollectorReferenceHDO> collectors)
    {
        this.collectors = collectors;
    }

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_MADE_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK",referencedColumnName="ID") }, 
    		inverseJoinColumns = { @JoinColumn(name = "DATE_MADE_FK",referencedColumnName="ID") })
    public Set<MimsyDateHDO> getMadeDates()
    {
        return made;
    }

    //DATE_MADE.*
    public void setMadeDates(Set<MimsyDateHDO> date_made)
    {
        this.made = date_made;
    }
        
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "MIMSY_OBJECT_COLLECTED_LINK", 
    		joinColumns = { @JoinColumn(name = "MIMSY_OBJECT_FK",referencedColumnName="ID") }, 
    		inverseJoinColumns = { @JoinColumn(name = "DATE_COLLECTED_FK",referencedColumnName="ID") })
    public Set<MimsyDateHDO> getCollectedDates()
    {
        return collected;
    }

    //DATE_COLLECTED.*
    public void setCollectedDates(Set<MimsyDateHDO> collected)
    {
        this.collected = collected;
    }
    
    @OneToOne(cascade=CascadeType.ALL)	
    public RightsHDO getRights()
    {
        return rights;
    }

    //RIGHTS.*
    public void setRights(RightsHDO rights)
    {
        this.rights = rights;
    }
 
    
    /*public void setSummaryTitle(String summary_title)
    {
    	this.summary_title=summary_title;
    }
    
    @Column(name="OBJ_SUMMARY_TITLE", length=2000)
    public String getSummaryTitle()
    {   
    	return summary_title;
    }*/
    
    public void setDisplayDate(String display_date)
    {
    	this.display_date=display_date;
    }
    
    @Column(name="OBJ_DISPLAY_DATE", length=256)
    public String getDisplayDate()
    {   
    	return display_date;
    }
    
    
	public static MimsyObjectDataHDO lookupDataOrCreateStub(Session sess,
			String mimsy_identifier) throws Exception 
	{
		 MimsyObjectDataHDO retval = (MimsyObjectDataHDO)BaseMimsyDataHDO.lookup(sess, mimsy_identifier);
		 if(retval==null)
		 {
			 MimsyObjectDataHDO context = new MimsyObjectDataHDO();
			 context.setConformance(ObjectConformanceEnum.UNKNOWN);
			 context.setMimsyIdentifier(mimsy_identifier);
			 context.setLastUpdated(new Date());
			 context.setDataType(MimsyDataTypeEnum.OBJECT);	
			 context.setChecksum(MimsyHelper.getChecksum(mimsy_identifier));
			 retval=context;
			 sess.save(retval);
			 sess.flush();
		 }
		 return retval;
	}
	
	public void clear()
	{
		super.clear();
		
	    other_numbers = null;    
	    record_type = null;  
	   // name = null;
	    item_count = null;			  
	    section = null;  
	    names = null;   
	    boroughs = null;   
	    functional_classification = null;   
	    title = null;
	    other_titles = null; 
	    publisher = null;
	    pagination = null;
	    site = null;
	    materials  = null; 
	    primary_material = null; 
	    measurements = null;
	    descriptions = null; 
	    acquisition = null;
	    credit_line = null;
	    owner_status = null;
	    permanent_location = null;
	    current_location = null; 
	    loan_allowed = null;
	    project_notes = null;  
	    intended_use = null;    
	    conservation_action = null;    
	    project_codes = null;     
	    linked_objects = null; 
	    linked_places = null; 
	    linked_agents = null; 
	    linked_events = null; 
	    linked_media = null; 
	    linked_publications = null; 
	    linked_subjects = null;  
	    linked_sites = null;    
	    makers = null;     
	    collectors = null;    
	    made = null; 
	    collected = null;  
	    additional_information = null;
	    rights = null;   
	    note = null;
	    //maker = null; 
	    //collector = null;     
	    place_made = null;
	    place_collected = null;
	    summary = null;
	    object_id = null;
	    display_date = null;
	}	 
}
