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

被折叠的 条评论
为什么被折叠?



