Hibernate的对象关系映射(6)

2.4 集合映射

java的collection和数组都可以被映射,意义在于表示数据之间的关联,对于hibernate管理的数据而言,java的集合对象主要起到了接口的作用。

2.4.1 Map

(1) index和element

<?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-mapping package="com.weportal.collection">
    
<class name="Team">
        
<id name="id">
            
<generator class="hilo"/>
        
</id>
        
<property name="name" column="NAME" />
        
<map name="members"  order-by="name,teamRole" >
            
<key foreign-key="fk">
                
<column name="teamNumber"/>
            
</key>
            
<index column="teamRole" type="string"/>
            
<element column="name" type="string"/>
        
</map>    
    
</class>
</hibernate-mapping>

 (2) one-to-many

例如:如果将属性members(集合类型)映射到持久化类,需要使用one-to-many或者many-to-many。映射文件如下:

<?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-mapping package="com.weportal.collection">
    
<class name="Team">
        
<id name="id">
            
<generator class="hilo"/>
        
</id>
        
<property name="name" column="NAME" />
        
<map name="members"  inverse="false" >
            
<key column="team" foreign-key="fk">
            
</key>
            
<index column="teamRole" type="string"/>
            
<one-to-many class="Member"/>
        
</map>    
    
</class>
    
<class name="Member">
        
<id name="id">
            
<generator class="native"></generator>
        
</id>
        
<property name="name"></property>
        
<property name="age"></property>
        
<many-to-one name="team"></many-to-one>
    
</class>
</hibernate-mapping>

(3) many-to-many

建立这种多对多的关系不是一个优秀的方案。

(4) composite-index

Map中的index元素可以被替换为存储组件对象的composite-index,利用composite-index可将组件用于index。

<?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-mapping package="com.weportal.collection">
    
<class name="Team">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name" column="NAME" />
        
<map name="members" inverse="false">
            
<key column="team" foreign-key="fk"/>
            
<composite-index class="Position">
                
<key-property name="role"/>
                
<key-property name="scene"/>
                
<key-many-to-one name="bestChoice" class="Member"/>
            
</composite-index>
            
<one-to-many class="Member"/>
        
</map>
    
</class>
    
<class name="Member">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
        
<property name="age"/>
        
<many-to-one name="team"/>
    
</class>
</hibernate-mapping>

(5) index-many-to-many

index不仅可以是组件,也可以是持久化类的实体。

<?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-mapping package="com.weportal.collection">
    
<class name="Team">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name" column="NAME" />
        
<map name="members" inverse="false">
            
<key column="team" foreign-key="fk"/>
            
<index-many-to-many class="Position" column="id"></index-many-to-many>
            
<one-to-many class="Member"/>
        
</map>
    
</class>
    
<class name="Member">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
        
<property name="age"/>
        
<many-to-one name="team"/>
    
</class>
    
<class name="Position">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="role"/>
        
<property name="scene"/>
        
<many-to-one name="bestChoice"/>
    
</class>    
</hibernate-mapping>

(6) index-many-to-any

index还可以插入any类型的数据,any在hibernate中代表不确定的类型。

<?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-mapping package="com.weportal.collection">
    
<class name="Team">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name" column="NAME" />
        
<map name="members" inverse="false">
            
<key column="team" foreign-key="fk"/>
            
<index-many-to-any id-type="long" meta-type="string">
             
<column name="index_class"></column>
             
<column name="index_id"></column>             
            
</index-many-to-any>
            
<one-to-many class="Position"/>
        
</map>
    
</class>
    
<class name="Member">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
        
<property name="age"/>
        
<many-to-one name="team"/>
    
</class>    
    
<class name="Position">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="role"/>
        
<property name="scene"/>
        
<many-to-one name="bestChoice"/>
    
</class>        
</hibernate-mapping>

(7) many-to-any

value的值也可设为any类型。

<?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-mapping package="com.weportal.collection">
    
<class name="Team">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name" column="NAME" />
        
<map name="members" inverse="false">
            
<key column="team" foreign-key="fk"/>
            
<index-many-to-any id-type="long" meta-type="string">
             
<column name="index_class"></column>
             
<column name="index_id"></column>             
            
</index-many-to-any>
            
<many-to-any id-type="long" meta-type="string">
             
<column name="value_class"></column>
             
<column name="value_id"></column>
            
</many-to-any>
        
</map>
    
</class>
    
<class name="Member">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
        
<property name="age"/>
        
<many-to-one name="team"/>
    
</class>    
    
<class name="Position">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="role"/>
        
<property name="scene"/>
        
<many-to-one name="bestChoice"/>
    
</class>        
</hibernate-mapping>

(8) composite-element

可以用来声明更复杂的数据元素。

<?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-mapping package="com.weportal.collection">
    
<import class="Member"></import>
    
<class name="Team">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name" column="NAME" />
        
<map name="members" table="teamMembers">
            
<key column="teamId"/>
            
<index column="teamRole" type="string"/>
            
<composite-element class="Member">
                
<parent name="team"/>
                
<property name="name"/>
                
<property name="age"/>                
            
</composite-element>
        
</map>
    
</class>
</hibernate-mapping>
可以利用nested-composite-element在类中嵌套类。
<?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-mapping package="com.weportal.collection">
    
<import class="Member"></import>
    
<class name="Team">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name" column="NAME" />
        
<map name="members" table="teamMembers">
            
<key column="teamId"/>
            
<index column="teamRole" type="string"/>
            
<composite-element class="Member">
                
<parent name="team"/>
                
<property name="name"/>
                
<property name="age"/>
                
<nested-composite-element name="assistantMember" class="Member">
                    
<property name="name" column="assistant"></property>
                
</nested-composite-element>            
            
</composite-element>
        
</map>
    
</class>
</hibernate-mapping>

(9) Map的排序

利用sort和order-by属性来声明。

(10) Map的子元素和属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值