浅析Hibernate集合映射inverse和cascade

  • 在Hibernate annotation 中inverse 默认值是"true" 当配置了mappedBy="…"时就相当于inverse="false"了。CascadeType类中有这样几个常量,ALL、PERSIST、 MERGE、REFRESH、REMOVE 。

Hibernate有很多值得学习的地方,这里我们主要了解和测试Hibernate cascade和Hibernate inverse,希望对大家的学习有所帮助。

1: Hibernate inverse

在Hibernate annotation 中inverse 默认值是"true" 当配置了mappedBy="…"时就相当于inverse="false"了。

2: Hibernate cascade

CascadeType类中有这样几个常量,ALL、PERSIST、MERGE、REFRESH、REMOVE 。

让代码说话吧:

 
 
  1. @Entity   
  2.  
  3. @Table( name  =  "Users" )   
  4.  
  5. public class User implements java.io.Serializable {   
  6.  
  7.    
  8.  
  9.    
  10.  
  11.     private String id;   
  12.  
  13.    
  14.  
  15.     private Rose rose;   
  16.  
  17.    
  18.  
  19.     public User() {   
  20.  
  21.     }   
  22.  
  23.    
  24.  
  25.     @Id   
  26.  
  27.     @Column( name  =  "Id" unique  =  true nullable  =  false insertable  =  true updatable  =  true length  =  5 )   
  28.  
  29.     public String getId() {   
  30.  
  31.         return this.id;   
  32.  
  33.     }   
  34.  
  35.    
  36.  
  37.     public void setId(String id) {   
  38.  
  39.          this.id  = id;   
  40.  
  41.     }   
  42.  
  43.    
  44.  
  45.     @ManyToOne( cascade  = { CascadeType.PERSIST, CascadeType.MERGE },  fetch  =  FetchType .LAZY)   
  46.  
  47.     @JoinColumn( name  =  "Roseid" unique  =  false nullable  =  false insertable  =  true updatable  =  true )   
  48.  
  49.     public Rose getRose() {   
  50.  
  51.         return this.rose;   
  52.  
  53.     }   
  54.  
  55.    
  56.  
  57.     public void setRose(Rose rose) {   
  58.  
  59.          this.rose  = rose;   
  60.  
  61.     }   
  62.  
  63. }   
  64.  
  65.    
  66.  
  67. @Entity   
  68.  
  69. @Table( name  =  "Rose" )   
  70.  
  71. public class Rose implements java.io.Serializable {   
  72.  
  73.    
  74.  
  75.     private String id;   
  76.  
  77.    
  78.  
  79.     private Set < User >   users  =  new  HashSet < User > (0);   
  80.  
  81.    
  82.  
  83.     public Rose() {   
  84.  
  85.     }   
  86.  
  87.    
  88.  
  89.     @Id   
  90.  
  91.     @Column( name  =  "Id" unique  =  true nullable  =  false insertable  =  true updatable  =  true length  =  3 )   
  92.  
  93.     public String getId() {   
  94.  
  95.         return this.id;   
  96.  
  97.     }   
  98.  
  99.    
  100.  
  101.     public void setId(String id) {   
  102.  
  103.          this.id  = id;   
  104.  
  105.     }   
  106.  
  107.    
  108.  
  109.     @OneToMany( cascade  = { CascadeType.ALL },  fetch  =  FetchType .EAGER )   
  110.  
  111.     @JoinColumn( name = "RoseId" )   
  112.  
  113.     public Set < User >  getUsers() {   
  114.  
  115.         return this.users;   
  116.  
  117.     }   
  118.  
  119.    
  120.  
  121.     public void setUsers(Set < User >  userses) {   
  122.  
  123.          this.users  =  userses ;   
  124.  
  125.     }   
  126.  
  127.    
  128.  
  129.     public void addUser(User user) {   
  130.  
  131.         user.setRose(this);   
  132.  
  133.         users.add(user);   
  134.  
  135.     }   
  136.  

当在user类中配置成cascade = { CascadeType.PERSIST, CascadeType.MERGE } 时,更新和删除两个级联时:

 
 
  1. Hibernate: select user_.Id, user_.Enabledel as Enabledel1_, user_.Name as Name1_, user_.Password as Password1_, user_.Roseid as Roseid1_ from ERP.dbo.Users user_ where  user_.Id =?   
  2.  
  3. Hibernate: select rose_.Id, rose_.Enabledel as Enabledel0_, rose_.Name as Name0_, rose_.Parent as Parent0_ from ERP.dbo.Rose rose_ where  rose_.Id =?   
  4.  
  5. Hibernate: delete from ERP.dbo.Users where  Id =?   
  6.  

可以正常删除!但是代码要这样写:

 
 
  1. User  user  = new  User("adm");   
  2.  
  3.          user.setRose(new Rose("adm"));    //这句不加就不能删除,提示错误。除非数据库不加级联限制   
  4.  
  5.         userDao.delete(user);   
  6.  

当在user类中配置成cascade = { CascadeType.ALL } or cascade={} 时,无法删除。更新时也类似于这种情况,注意rose类中的addUser(User user)方法。再有fetch = FetchType.EAGER。在这里不是延时加载,如果设置成LAZY,在取得数据时怎么做好呢?看其他论坛的方法各有好处也有不好的地方,在找一个 更方法。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值