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