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<User> users = new HashSet<User>(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<User> getUsers() {
return this.users;
}
public void setUsers(Set<User> userses) {
this.users = userses;
}
public void addUser(User user) {
user.setRose(this);
users.add(user);
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
当在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=?
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
可以正常删除!但是代码要这样写:
User user =new User("adm");
user.setRose(new Rose("adm")); //这句不加就不能删除,提示错误。除非数据库不加级联限制
userDao.delete(user);
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
当在user类中配置成cascade = { CascadeType.ALL } or cascade={} 时,无法删除。更新时也类似于这种情况,注意rose类中的addUser(User user)方法。再有fetch = FetchType.EAGER。在这里不是延时加载,如果设置成LAZY,在取得数据时怎么做好呢?看其他论坛的方法各有好处也有不好的地方,在找一个更方法。。。
【编辑推荐】