Hibernate的对象关系映射(6)

本文深入探讨了Hibernate框架中集合映射的各种方式,包括简单的index和element映射、复合索引composite-index的应用、多对多及复合元素composite-element的映射等,并介绍了如何通过属性进行排序。

2.4 集合映射

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

2.4.1Map

(1) index和element

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mappingpackage="com.weportal.collection">
<classname="Team">
<idname="id">
<generatorclass="hilo"/>
</id>
<propertyname="name"column="NAME"/>
<mapname="members"order-by="name,teamRole">
<keyforeign-key="fk">
<columnname="teamNumber"/>
</key>
<indexcolumn="teamRole"type="string"/>
<elementcolumn="name"type="string"/>
</map>
</class>
</hibernate-mapping>

(2) one-to-many

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

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="com.weportal.collection">
<classname="Team">
<idname="id">
<generatorclass="hilo"/>
</id>
<propertyname="name"column="NAME"/>
<mapname="members"inverse="false">
<keycolumn="team"foreign-key="fk">
</key>
<indexcolumn="teamRole"type="string"/>
<one-to-manyclass="Member"/>
</map>
</class>
<classname="Member">
<idname="id">
<generatorclass="native"></generator>
</id>
<propertyname="name"></property>
<propertyname="age"></property>
<many-to-onename="team"></many-to-one>
</class>
</hibernate-mapping>

(3) many-to-many

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

(4) composite-index

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

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mappingpackage="com.weportal.collection">
<classname="Team">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"column="NAME"/>
<mapname="members"inverse="false">
<keycolumn="team"foreign-key="fk"/>
<composite-indexclass="Position">
<key-propertyname="role"/>
<key-propertyname="scene"/>
<key-many-to-onename="bestChoice"class="Member"/>
</composite-index>
<one-to-manyclass="Member"/>
</map>
</class>
<classname="Member">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<propertyname="age"/>
<many-to-onename="team"/>
</class>
</hibernate-mapping>

(5) index-many-to-many

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

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mappingpackage="com.weportal.collection">
<classname="Team">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"column="NAME"/>
<mapname="members"inverse="false">
<keycolumn="team"foreign-key="fk"/>
<index-many-to-manyclass="Position"column="id"></index-many-to-many>
<one-to-manyclass="Member"/>
</map>
</class>
<classname="Member">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<propertyname="age"/>
<many-to-onename="team"/>
</class>
<classname="Position">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="role"/>
<propertyname="scene"/>
<many-to-onename="bestChoice"/>
</class>
</hibernate-mapping>

(6) index-many-to-any

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

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mappingpackage="com.weportal.collection">
<classname="Team">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"column="NAME"/>
<mapname="members"inverse="false">
<keycolumn="team"foreign-key="fk"/>
<index-many-to-anyid-type="long"meta-type="string">
<columnname="index_class"></column>
<columnname="index_id"></column>
</index-many-to-any>
<one-to-manyclass="Position"/>
</map>
</class>
<classname="Member">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<propertyname="age"/>
<many-to-onename="team"/>
</class>
<classname="Position">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="role"/>
<propertyname="scene"/>
<many-to-onename="bestChoice"/>
</class>
</hibernate-mapping>

(7) many-to-any

value的值也可设为any类型。

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mappingpackage="com.weportal.collection">
<classname="Team">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"column="NAME"/>
<mapname="members"inverse="false">
<keycolumn="team"foreign-key="fk"/>
<index-many-to-anyid-type="long"meta-type="string">
<columnname="index_class"></column>
<columnname="index_id"></column>
</index-many-to-any>
<many-to-anyid-type="long"meta-type="string">
<columnname="value_class"></column>
<columnname="value_id"></column>
</many-to-any>
</map>
</class>
<classname="Member">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<propertyname="age"/>
<many-to-onename="team"/>
</class>
<classname="Position">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="role"/>
<propertyname="scene"/>
<many-to-onename="bestChoice"/>
</class>
</hibernate-mapping>

(8) composite-element

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

<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mappingpackage="com.weportal.collection">
<importclass="Member"></import>
<classname="Team">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"column="NAME"/>
<mapname="members"table="teamMembers">
<keycolumn="teamId"/>
<indexcolumn="teamRole"type="string"/>
<composite-elementclass="Member">
<parentname="team"/>
<propertyname="name"/>
<propertyname="age"/>
</composite-element>
</map>
</class>
</hibernate-mapping>
可以利用nested-composite-element在类中嵌套类。
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mappingpackage="com.weportal.collection">
<importclass="Member"></import>
<classname="Team">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"column="NAME"/>
<mapname="members"table="teamMembers">
<keycolumn="teamId"/>
<indexcolumn="teamRole"type="string"/>
<composite-elementclass="Member">
<parentname="team"/>
<propertyname="name"/>
<propertyname="age"/>
<nested-composite-elementname="assistantMember"class="Member">
<propertyname="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、付费专栏及课程。

余额充值