【发布时间】:2011-08-25 22:33:59
【问题描述】:
这个问题已经被问过无数次了,但我没有看到满意的答案,所以我再问一次。
想象以下情况:
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;
...
}
我只想删除一个用户。从逻辑上讲,将假设所有连接用户和位置的相关“关注者”条目都将被删除。如果我删除 Location 条目,同样的假设应该仍然有效。
实际发生的情况是,Hibernate 尝试更新(?!?)包含关注者的表,并且由于相关实体(用户或位置)已被发送删除,因此尝试设置外键,例如,后跟空。这会引发异常并爆破所有后续操作。
我得到的错误: 服务器上出现未处理的故障。无法执行 JDBC 批量更新; SQL [update locationstofollowers set followerId=null where followerId=?];约束[空];嵌套异常是 org.hibernate.exception.ConstraintViolationException: 无法执行 JDBC 批量更新
附:我听说还有另一个级联选项 DELETE_ORPHAN。这似乎被弃用了,即使我也尝试过,效果是一样的。
【问题讨论】:
-
很好的问题。遗憾的是,这方面的讨论并不多。
标签: java hibernate orm cascading-deletes