Hibernate的对象关系映射(6)

    技术2022-05-11  45

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


    最新回复(0)