浅析Hibernate集合映射inverse和cascade

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. @Table(name = "Users") 
  3. public class User implements java.io.Serializable { 
  4.  
  5.  
  6.     private String id; 
  7.  
  8.     private Rose rose; 
  9.  
  10.     public User() { 
  11.     } 
  12.  
  13.     @Id 
  14.     @Column(name = "Id", unique = true, nullable = false, insertable = true, updatable = true, length = 5) 
  15.     public String getId() { 
  16.         return this.id; 
  17.     } 
  18.  
  19.     public void setId(String id) { 
  20.         this.id = id; 
  21.     } 
  22.  
  23.     @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY) 
  24.     @JoinColumn(name = "Roseid", unique = false, nullable = false, insertable = true, updatable = true) 
  25.     public Rose getRose() { 
  26.         return this.rose; 
  27.     } 
  28.  
  29.     public void setRose(Rose rose) { 
  30.         this.rose = rose; 
  31.     } 
  32. } 
  33.  
  34. @Entity 
  35. @Table(name = "Rose") 
  36. public class Rose implements java.io.Serializable { 
  37.  
  38.     private String id; 
  39.  
  40.     private Set users = new HashSet(0); 
  41.  
  42.     public Rose() { 
  43.     } 
  44.  
  45.     @Id 
  46.     @Column(name = "Id", unique = true, nullable = false, insertable = true, updatable = true, length = 3) 
  47.     public String getId() { 
  48.         return this.id; 
  49.     } 
  50.  
  51.     public void setId(String id) { 
  52.         this.id = id; 
  53.     } 
  54.  
  55.     @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER ) 
  56.     @JoinColumn(name="RoseId") 
  57.     public Set getUsers() { 
  58.         return this.users; 
  59.     } 
  60.  
  61.     public void setUsers(Set userses) { 
  62.         this.users = userses; 
  63.     } 
  64.  
  65.     public void addUser(User user) { 
  66.         user.setRose(this); 
  67.         users.add(user); 
  68.     } 

当在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. Hibernate: select rose_.Id, rose_.Enabledel as Enabledel0_, rose_.Name as Name0_, rose_.Parent as Parent0_ from ERP.dbo.Rose rose_ where rose_.Id=? 
  3. Hibernate: delete from ERP.dbo.Users where Id=? 

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

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

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


名称栏目:浅析Hibernate集合映射inverse和cascade
网站链接:http://www.xwwzsj.com/article/djcjghp.html

其他资讯

售后响应及时

7×24小时客服热线

数据备份

更安全、更高效、更稳定

价格公道精准

项目经理精准报价不弄虚作假

合作无风险

重合同讲信誉,无效全额退款