這個問題已被問過很多次,但我沒有看到一個令人滿意的答案,因此,我再次問它。在休眠級聯刪除的問題
想象一下以下情況:
public class User {
...
@Cascade(value= {CascadeType.DELETE})
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name="followerId")
public List<LocationFollower> followedLocations;
...
}
public class LocationFollower {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
public Long id;
@ManyToOne
@JoinColumn(name="locationId")
public Location followedLocation;
@ManyToOne
@JoinColumn(name="followerId")
public User follower;
@Column(name = "followerSince")
public Timestamp followerSince;
}
public class Location {
...
@Cascade(value = {CascadeType.DELETE})
@OneToMany(fetch= FetchType.LAZY)
@JoinColumn(name="locationId")
public List<LocationFollower> followers;
...
}
所有我想要的是刪除用戶。從邏輯上講,會假設所有連接用戶和位置的相關「關注者」條目都將被刪除。如果我刪除一個位置條目,則相同的假設應該保持在這種狀態。
實際發生的事情是,Hibernate試圖更新(?!?)擁有關注者的表,並且因爲相關實體(用戶或位置)已被髮送刪除,所以嘗試設置外鍵followerId爲null。這會引發異常,並破壞所有後續操作。
我得到的錯誤: 服務器出現未處理的故障。無法執行JDBC批處理更新; SQL [update locationstofollowers set followerId = null where followerId =?];約束[null];嵌套異常是org.hibernate.exception.ConstraintViolationException:無法執行JDBC批量更新
P.S.我聽說有另一個級聯選項DELETE_ORPHAN。這似乎已被廢棄,即使我也嘗試過,效果也是一樣的。
非常好的問題。可悲的是,在這方面沒有多少討論。 – pavanlimo 2011-08-03 12:53:59