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>
<?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的子元素和属性
略

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



