休眠中级联删除的问题
2022-09-04 22:48:10
这个问题以前被问过无数次,但从那以后我没有看到令人满意的答案,因此我再次问它。
想象一下以下情况:
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尝试更新(?!?)包含关注者的表,并且由于相关实体(用户或位置)已被发送删除,因此尝试设置一个外键,例如,后跟null。这将引发异常并突增所有后续操作。
我得到的错误:服务器上有一个未处理的故障。无法执行 JDBC 批量更新;SQL [update locationstofollowers set followerId=null where followerId=?];约束 [空];嵌套异常是 org.hibernate.exception.ConstraintViolationException: 无法执行 JDBC 批量更新
附言:我听说DELETE_ORPHAN还有另一个级联选项。这似乎已被弃用,即使我也尝试过,效果也是一样的。