Hibernate的对象关系映射(6)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值