<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- *****************************************************   -->
<!--  Hibernate 3.1 O/R Mapping for OpenXRI Database         -->
<!--  @author Sudhir Ancha 				     -->
<!-- *****************************************************   -->

<hibernate-mapping>
        
    <!-- ***************************************************** -->
    <!--       Start XRIDElement Class Definition              -->
    <!-- ***************************************************** -->
    
    <class name="org.openxri.store.data.XRIDElement" table="xrid_element"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="xridKey" column="xrid_key" unsaved-value="undefined" >        
            <generator class="native"/>            
        </id>

        <property name="parentAuthorityId"                 type="string"    column="parent_authority_id" not-null="true"  />
        <property name="subsegment"                        type="string"    column="subsegment"          not-null="true"  />        
        
        <property name="extensionElementKey"               type="int"    column="extension_element_key" />
        <property name="extensionAttributeKey"             type="int"    column="extension_attribute_key" />
        <property name="expiryTimeExtensionAttributeKey"   type="int"    column="expiry_time_ext_attr_key" />
        <property name="subsegmentExtensionAttributeKey"   type="int"    column="subsegment_ext_attr_key" />
        <property name="trustMechanismKey"   		   type="int"    column="trust_mechanism_key" />
        
        <property name="updateDate"                        type="timestamp" column="update_date" />
        <property name="creationDate"                      type="timestamp" column="creation_date" />
        <property name="expiryTime"                        type="timestamp" column="expiry_time" />
               
        
        <set
              name="authorityElements"
              table="xrid_authority_element"              
              inverse="true"
              lazy="false"
              cascade="all,delete-orphan" >
              
              <key column="xrid_key" />
              <one-to-many class="org.openxri.store.data.AuthorityElement" />        
        </set>


        <set
              name="serviceElements"
              table="xrid_service_element"              
              inverse="true"
              lazy="false"
              cascade="all,delete-orphan" >
              
              <key column="xrid_key" />
              <one-to-many class="org.openxri.store.data.ServiceElement" />        
        </set>

	<set
              name="extensionElements"
              table="extension_element"              
              inverse="true"
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_element_key" property-ref="extensionElementKey" />
              <one-to-many class="org.openxri.store.data.ExtensionElement" />        
        </set>

	<set
              name="extensionAttributes"
              table="extension_attribute"              
              inverse="true"              
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_attribute_key" property-ref="extensionAttributeKey"  />
              <one-to-many class="org.openxri.store.data.ExtensionAttribute" />        
        </set>
     
	<set
              name="expiryTimeExtensionAttributes"
              table="extension_attribute"              
              inverse="true"              
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_attribute_key" property-ref="expiryTimeExtensionAttributeKey"  />
              <one-to-many class="org.openxri.store.data.ExtensionAttribute" />        
        </set>

	<set
              name="subsegmentExtensionAttributes"
              table="extension_attribute"              
              inverse="true"              
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_attribute_key" property-ref="subsegmentExtensionAttributeKey"  />
              <one-to-many class="org.openxri.store.data.ExtensionAttribute" />        
        </set>

	<set
              name="trustMechanismList"
              table="trust_mechanism"              
              inverse="true"              
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="trust_mechanism_key" property-ref="trustMechanismKey"  />
              <one-to-many class="org.openxri.store.data.TrustMechanism" />        
        </set>

       </class>	

    <!-- ***************************************************** -->
    <!--       Start AuthorityElement Class Definition         -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.AuthorityElement" table="xrid_authority_element"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="xriAuthorityElementKey" column="xri_authority_element_key" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>

        <property name="authorityId"             type="string"    column="authority_id"  not-null="true" />               
        
        <!-- It's Mandatory to set the Parent Element Reference. Else the XRID_KEY will not be persisted -->
        
   	<many-to-one name="xridElement" column="xrid_key" class="org.openxri.store.data.XRIDElement" not-null="true" lazy="false"/> 
      
        <property name="priority"  type="int"  column="priority"   />
        
        <property name="extensionAttributeKey"   type="int"    column="extension_attribute_key"   />
        <property name="extensionElementKey"     type="int"    column="extension_element_key"   />        
        <property name="uriPriorityKey"          type="int"    column="uri_priority_key"   />
        <property name="trustMechanismKey"       type="int"    column="trust_mechanism_key" />
        
        <property name="authorityIdExtensionAttributeKey"      type="int"  column="authority_id_extens_attr_key" />        
	
        <many-to-one name="typeUri" class="org.openxri.store.data.XRIUri" 
        			    unique="true"  
        			    cascade="all" 
        			    update="true" 
        			    insert="true" 
        			    lazy="false" >        			    
        	<column name="`type-uri_key`" />
        </many-to-one>     	
     
	<set
              name="extensionElements"
              table="extension_element"              
              inverse="true"
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_element_key" property-ref="extensionElementKey"  />
              <one-to-many class="org.openxri.store.data.ExtensionElement" />        
        </set>
        
	<set
              name="extensionAttributes"
              table="extension_attribute"              
              inverse="true"              
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_attribute_key" property-ref="extensionAttributeKey"  />
              <one-to-many class="org.openxri.store.data.ExtensionAttribute" />        
        </set>
     
	<set
              name="authorityIdExtensionAttributes"
              table="extension_attribute"              
              inverse="true"              
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_attribute_key" property-ref="authorityIdExtensionAttributeKey"  />
              <one-to-many class="org.openxri.store.data.ExtensionAttribute" />        
        </set>
     
	<set
              name="uriPriorityList"
              table="uri_priority"              
              inverse="true"
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <!--  Column Attr Refers Column in remote class used in where clause -->
              <!--  property-ref Attr refers to Value in this class that will be used as value in Where clause -->
              
              <key column="uri_priority_key" property-ref="uriPriorityKey"  />
              <one-to-many class="org.openxri.store.data.UriPriority" />        
        </set>
        
	<set
              name="trustMechanismList"
              table="trust_mechanism"              
              inverse="true"              
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="trust_mechanism_key" property-ref="trustMechanismKey"  />
              <one-to-many class="org.openxri.store.data.TrustMechanism" />        
        </set>        
        
     </class>		

    <!-- ***************************************************** -->
    <!--       Start ServiceElement Class Definition         -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.ServiceElement" table="xrid_service_element" 
    		dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="xridServiceElementKey" column="xrid_service_element_key" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>
        
        <property name="priority"   type="int"  column="priority"   />
        
        <property name="extensionElementKey"    type="int"    column="extension_element_key"   />
        <property name="extensionAttributeKey"  type="int"    column="extension_attribute_key"   />        
        <property name="uriPriorityKey"         type="int"    column="uri_priority_key" /> 
        <property name="mediaTypeKey"           type="int"    column="media_type_key" /> 
        
        <!-- It's Mandatory to set the Parent Element Reference. Else the XRID_KEY will not be persisted -->
        
        <many-to-one name="xridElement" column="xrid_key" class="org.openxri.store.data.XRIDElement" not-null="true" lazy="false"/> 
        

        <many-to-one name="typeUri" class="org.openxri.store.data.XRIUri" 
        			    unique="true"  
        			    cascade="all" 
        			    update="true" 
        			    insert="true" 
        			    lazy="false" >        			    
        	<column name="`type-uri_key`" />
        </many-to-one>     	
              

	<set
              name="extensionElements"
              table="extension_element"              
              inverse="true"
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_element_key" property-ref="extensionElementKey"  />
              <one-to-many class="org.openxri.store.data.ExtensionElement" />        
        </set>
        
	<set
              name="extensionAttributes"
              table="extension_attribute"              
              inverse="true"              
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_attribute_key" property-ref="extensionAttributeKey"  />
              <one-to-many class="org.openxri.store.data.ExtensionAttribute" />        
        </set>

	<set
              name="uriPrioritySet"
              table="uri_priority"              
              inverse="true"
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <!--  Column Attr Refers Column in remote class used in where clause -->
              <!--  property-ref Attr refers to Value in this class that will be used as value in Where clause -->
              
              <key column="uri_priority_key" property-ref="uriPriorityKey"  />
              <one-to-many class="org.openxri.store.data.UriPriority" />        
        </set>

	<set
              name="mediaTypeList"
              table="media_type"              
              inverse="true"
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <!--  Column Attr Refers Column in remote class used in where clause -->
              <!--  property-ref Attr refers to Value in this class that will be used as value in Where clause -->
              
              <key column="media_type_key" property-ref="mediaTypeKey"  />
              <one-to-many class="org.openxri.store.data.MediaType" />        
        </set>



     </class>		

    <!-- ***************************************************** -->
    <!--       Start SynonymElement Class Definition           -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.SynonymElement" table="xrid_authority_element"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="xridSynonymElementKey" column="xrid_synonym_element_key" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>

        <many-to-one name="xridElement" column="xrid_key" class="org.openxri.store.data.XRIDElement" not-null="true" lazy="false"/> 
      
        <property name="extensionAttributeKey"   type="int"    column="extension_attribute_key"   />
        <property name="extensionElementKey"     type="int"    column="extension_element_key"   />        
        <property name="internalUriPriorityKey"  type="int"    column="internal_uri_priority_key"   />
        <property name="externalUriPriorityKey"  type="int"    column="external_uri_priority_key"   />
                
	<set
              name="extensionElements"
              table="extension_element"              
              inverse="true"
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_element_key" property-ref="extensionElementKey"  />
              <one-to-many class="org.openxri.store.data.ExtensionElement" />        
        </set>
        
	<set
              name="extensionAttributes"
              table="extension_attribute"              
              inverse="true"              
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <key column="extension_attribute_key" property-ref="extensionAttributeKey"  />
              <one-to-many class="org.openxri.store.data.ExtensionAttribute" />        
        </set>
     
	<set
              name="internalUriPriorityList"
              table="uri_priority"              
              inverse="true"
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <!--  Column Attr Refers Column in remote class used in where clause -->
              <!--  property-ref Attr refers to Value in this class that will be used as value in Where clause -->
              
              <key column="uri_priority_key" property-ref="internalUriPriorityKey"  />
              <one-to-many class="org.openxri.store.data.UriPriority" />        
        </set>
        

	<set
              name="externalUriPriorityList"
              table="uri_priority"              
              inverse="true"
              lazy="false"
              fetch="join"
              cascade="all,delete-orphan" >
              
              <!--  Column Attr Refers Column in remote class used in where clause -->
              <!--  property-ref Attr refers to Value in this class that will be used as value in Where clause -->
              
              <key column="uri_priority_key" property-ref="externalUriPriorityKey"  />
              <one-to-many class="org.openxri.store.data.UriPriority" />        
        </set>

     </class>	
     
    <!-- ***************************************************** -->
    <!--       Start UriPriority Class Definition         	       -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.UriPriority" table="uri_priority"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="serialNum" column="serial_num" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>

        <property name="uriPriorityKey"  type="int"  column="uri_priority_key" 	not-null="true"/>
        
        <property name="priority"   type="int"  column="priority"  not-null="true"/>
	
	<many-to-one name="xriUri"  class="org.openxri.store.data.XRIUri" 
        			    unique="true"  
        			    cascade="all" 
        			    update="true" 
        			    insert="true" 
        			    lazy="false" >        			    
        	<column name="uri_key" />
        </many-to-one>     	
                
    </class>	

    <!-- ***************************************************** -->
    <!--       Start XRIUri Class Definition         	       -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.XRIUri" table="uri"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="uriKey" column="uri_key" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>

        <property name="uri"        	        type="string"  column="uri"      not-null="true" />
        <property name="extensionAttributeKey"  type="int"  column="extension_attribute_key" />
        
    </class>	


    <!-- ***************************************************** -->
    <!-- Start MediaType Class Definition         	       -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.MediaType" table="media_type"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="serialNum" column="serial_num" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>

        <property name="mediaTypeKey"           type="int"     column="media_type_key"     not-null="true" />        
        <property name="mediaTypeString"        type="string"  column="media_type_string"  not-null="true" />
        <property name="extensionAttributeKey"  type="int"     column="extension_attribute_key" />
        
    </class>	

    <!-- ***************************************************** -->
    <!--       Start TrustMechanism Class Definition           -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.TrustMechanism" table="trust_mechanism"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="serialNum" column="serial_num" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>

        <property name="trustMechanismKey"     type="int"   column="trust_mechanism_key"  not-null="true" />        
        
        
        <many-to-one name="trustMechanismUri" class="org.openxri.store.data.XRIUri" 
        			    unique="true"  
        			    cascade="all" 
        			    update="true" 
        			    insert="true" 
        			    lazy="false" >        			    
        	<column name="`trust_mechanism-uri_key`" />
        </many-to-one>     	
        
    </class>	

    <!-- ***************************************************** -->
    <!--       Start ExtensionElement Class Definition         -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.ExtensionElement" table="extension_element"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="serialNum" column="serial_num" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>

        <property name="extensionXml"     type="string"   column="extension_xml"  not-null="true" />        
        <property name="extensionElementKey"  type="int"  column="extension_element_key" />
        
    </class>	
    
    <!-- ***************************************************** -->
    <!--       Start ExtensionAttribute Class Definition       -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.ExtensionAttribute" table="extension_attribute"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="serialNum" column="serial_num" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>
        
        <property name="extensionAttributeKey"  type="int"  column="extension_attribute_key" />

        <many-to-one name="extensionAttributeListData" class="org.openxri.store.data.ExtensionAttributeListData" unique="true"  
        			    cascade="all" update="true" insert="true" lazy="false">
        	<column name="extension_attr_list_key" />
        </many-to-one>        
        
        
    </class>	
    

    <!-- ***************************************************** -->
    <!--       Start ExtensionAttributeListData Class Definition       -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.ExtensionAttributeListData" table="extension_attribute_list"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <!-- Note : There has been change in thsi table. There is no longer a column called 
                    Serial Number and instead extensionAttrListKey will be used as Primary Column -->      
                    
        <id name="extensionAttrListKey" column="extension_attr_list_key" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>
        
	<property name="name"     type="string"   column="name"   not-null="true" />        
	<property name="value"    type="string"   column="value"  not-null="true" />        
	
        <many-to-one name="extensionAttributeNameSpace" class="org.openxri.store.data.ExtensionAttributeNameSpace" unique="true"  
        			    cascade="all" update="true" insert="true" lazy="false">
        	<column name="namespace_key" />
        </many-to-one>        
        
    </class>	


    <!-- ***************************************************** -->
    <!--       Start ExtensionAttributeNameSpace Class Definition       -->
    <!-- ***************************************************** -->

    <class name="org.openxri.store.data.ExtensionAttributeNameSpace" table="namespace_list"
                dynamic-update="true"
                dynamic-insert="true"
                select-before-update="true" >
             
        <id name="namespaceKey" column="namespace_key" unsaved-value="undefined" >
        	<generator class="native"/>
        </id>
        
	<property name="prefix" type="string"   column="prefix"   not-null="true" />        
	<property name="uri"    type="string"   column="uri"  	  not-null="true" />        
	
    </class>




    <!-- ***************************************************** -->
    <!--       Start ExtensionElementKey Class Definition           -->
    <!-- ***************************************************** -->

     <class name="org.openxri.store.data.ExtensionElementKey" table="last_extension_element_key"
           dynamic-update="true"
           dynamic-insert="true"
           select-before-update="true"                  
     > 
          
        <id name="key" column="key" unsaved-value="undefined">
               <generator class="native"/>
        </id>
        
    </class>

    <!-- ***************************************************** -->
    <!--       Start ExtensionAttributeKey Class Definition           -->
    <!-- ***************************************************** -->

     <class name="org.openxri.store.data.ExtensionAttributeKey" table="last_extension_attribute_key"
           dynamic-update="true"
           dynamic-insert="true"
           select-before-update="true"                  
     > 
          
        <id name="key" column="key" unsaved-value="undefined">
               <generator class="native"/>
        </id>
        
    </class>
    
    <!-- ***************************************************** -->
    <!--       Start TrustMechanismKey Class Definition           -->
    <!-- ***************************************************** -->

     <class name="org.openxri.store.data.TrustMechanismKey" table="last_trust_mechanism_key"
           dynamic-update="true"
           dynamic-insert="true"
           select-before-update="true"                  
     > 
          
        <id name="key" column="key" unsaved-value="undefined">
               <generator class="native"/>
        </id>
        
    </class>
    
    <!-- ***************************************************** -->
    <!--       Start UriPriorityKey Class Definition           -->
    <!-- ***************************************************** -->

     <class name="org.openxri.store.data.UriPriorityKey" table="last_uri_prority_key"
           dynamic-update="true"
           dynamic-insert="true"
           select-before-update="true"                  
     > 
          
        <id name="key" column="key" unsaved-value="undefined">
               <generator class="native"/>
        </id>
        
    </class>    

    <!-- ***************************************************** -->
    <!--       Start MediaTypeKey Class Definition           -->
    <!-- ***************************************************** -->

     <class name="org.openxri.store.data.MediaTypeKey" table="last_media_type_key"
           dynamic-update="true"
           dynamic-insert="true"
           select-before-update="true"                  
     > 
          
        <id name="key" column="key" unsaved-value="undefined">
               <generator class="native"/>
        </id>
        
    </class>    


    <!-- ***************************************************** -->
    <!--       Start CacheTable Class Definition               -->
    <!-- ***************************************************** -->

     <class name="org.openxri.store.cache.XRIDElementCache" table="cachetable"
           dynamic-update="true"
           dynamic-insert="true"
           select-before-update="true"                  
     > 
          
        <id name="xridKey" column="key" unsaved-value="undefined">
               <generator class="native"/>
        </id>

        <property name="parentUUID"    type="string"    column="parentuuid"   not-null="true" />
        <property name="subSegment"    type="string"    column="subsegment"   not-null="true" />                
        <property name="xridString"    type="string"    column="xridstring"   not-null="true" />
        
        <property name="signed"  type="java.lang.Boolean"  column="signed"    not-null="false" />
        
        <property name="updateDate"  type="timestamp" column="update_time"    not-null="true"/>
        
    </class>    


    <!-- ***************************************************** -->
    <!--       END OF MAPPING FOR ALL CLASSES                  -->
    <!-- ***************************************************** -->

    <!-- ***************************************************** -->
    <!--    START OF SCALAR MAPPING OF DIRECT SQL QUERIES      -->
    <!-- ***************************************************** -->

    <!-- Query used to retreive UUID of the ROOT Namespace -->
    
    <sql-query name="getRootNameSpaceUUID">
        <return-scalar column="authority_id" type="string"/>        
        
        SELECT authority_id FROM xrid_element x, xrid_authority_element xa
	    WHERE xa.xrid_key=x.xrid_key and x.subsegment=:subsegment

    </sql-query>
		     
    <!-- ***************************************************** -->
    <!--    END OF SCALAR MAPPING OF DIRECT SQL QUERIES      -->
    <!-- ***************************************************** -->

</hibernate-mapping>