浅析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. @Entity 
  34. @Table(name = "Rose") 
  35. public class Rose implements java.io.Serializable { 
  36.  
  37.     private String id; 
  38.  
  39.     private Set users = new HashSet(0); 
  40.  
  41.     public Rose() { 
  42.     } 
  43.  
  44.     @Id 
  45.     @Column(name = "Id", unique = true, nullable = false, insertable = true, updatable = true, length = 3) 
  46.     public String getId() { 
  47.         return this.id; 
  48.     } 
  49.  
  50.     public void setId(String id) { 
  51.         this.id = id; 
  52.     } 
  53.  
  54.     @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER ) 
  55.     @JoinColumn(name="RoseId") 
  56.     public Set getUsers() { 
  57.         return this.users; 
  58.     } 
  59.  
  60.     public void setUsers(Set userses) { 
  61.         this.users = userses; 
  62.     } 
  63.  
  64.     public void addUser(User user) { 
  65.         user.setRose(this); 
  66.         users.add(user); 
  67.     } 

当在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.shufengxianlan.com/qtweb/news9/550659.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联