今天又深入了了解和測試了一下Hibernate cascade 和 inverse 。
Inverse
在Hibernate annotation 中inverse 默認值是"true" 當配置了mappedBy="…"時就相當于inverse="false"了。
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);
????}
?
當在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,在取得數據時怎么做好呢?看其他論壇的方法各有好處也有不好的地方,在找一個更方法。。。
posted on 2007-05-31 20:52
Libo 閱讀(4832)
評論(3) 編輯 收藏