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

目前成都创新互联已为超过千家的企业提供了网站建设、域名、网页空间、网站运营、企业网站设计、安康网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
1: Hibernate inverse
在Hibernate annotation 中inverse 默认值是"true" 当配置了mappedBy="…"时就相当于inverse="false"了。
2: Hibernate cascade
CascadeType类中有这样几个常量,ALL、PERSIST、MERGE、REFRESH、REMOVE 。
让代码说话吧:
- @Entity
 - @Table(name = "Users")
 - public class User implements java.io.Serializable {
 - private String id;
 - private Rose rose;
 - public User() {
 - }
 - @Id
 - @Column(name = "Id", unique = true, nullable = false, insertable = true, updatable = true, length = 5)
 - public String getId() {
 - return this.id;
 - }
 - public void setId(String id) {
 - this.id = id;
 - }
 - @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY)
 - @JoinColumn(name = "Roseid", unique = false, nullable = false, insertable = true, updatable = true)
 - public Rose getRose() {
 - return this.rose;
 - }
 - public void setRose(Rose rose) {
 - this.rose = rose;
 - }
 - }
 - @Entity
 - @Table(name = "Rose")
 - public class Rose implements java.io.Serializable {
 - private String id;
 - private Set
 users = new HashSet (0); - public Rose() {
 - }
 - @Id
 - @Column(name = "Id", unique = true, nullable = false, insertable = true, updatable = true, length = 3)
 - public String getId() {
 - return this.id;
 - }
 - public void setId(String id) {
 - this.id = id;
 - }
 - @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER )
 - @JoinColumn(name="RoseId")
 - public Set
 getUsers() { - return this.users;
 - }
 - public void setUsers(Set
 userses) { - this.users = userses;
 - }
 - public void addUser(User user) {
 - user.setRose(this);
 - users.add(user);
 - }
 
当在user类中配置成cascade = { CascadeType.PERSIST, CascadeType.MERGE } 时,更新和删除两个级联时:
- 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=?
 - Hibernate: select rose_.Id, rose_.Enabledel as Enabledel0_, rose_.Name as Name0_, rose_.Parent as Parent0_ from ERP.dbo.Rose rose_ where rose_.Id=?
 - Hibernate: delete from ERP.dbo.Users where Id=?
 
可以正常删除!但是代码要这样写:
- User user =new User("adm");
 - user.setRose(new Rose("adm")); //这句不加就不能删除,提示错误。除非数据库不加级联限制
 - userDao.delete(user);
 
当在user类中配置成cascade = { CascadeType.ALL } or cascade={} 时,无法删除。更新时也类似于这种情况,注意rose类中的addUser(User user)方法。再有fetch = FetchType.EAGER。在这里不是延时加载,如果设置成LAZY,在取得数据时怎么做好呢?看其他论坛的方法各有好处也有不好的地方,在找一个更方法。。。
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号