我有三个课程的场景。类User
和UserDetail
通过@OneToOne
关系关联,而UserDetail
和Document
通过@OneToMany
关系关联。我在其中使用了CascadeType.ALL
和orphanRemoval=true
,如下所述。
正如类所指定的那样,用户不必具有UserDetail,但每个UserDetail必须具有User(因此optional
标志)。每个文档都必须与UserDetail相关联。这不是一个可选的关系!
public class User {
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL, optional = true, orphanRemoval = true)
private UserDetail details;
}
public class UserDetail {
@OneToOne(optional = false)
private User user;
@OneToMany(mappedBy = "detail", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Document> documents;
}
public class Document {
@ManyToOne
private UserDetail detail;
}
保存所有数据时,一切正常,但当我尝试将UserDetail设置为null
时,如果填充了文档列表,我会在Documents上获得完整性约束违例异常。 UserDetail的外键不能设置为null。
据我所知,当在User对象上设置details
为null并尝试合并它时,提供程序会尝试删除孤立的UserDetail,但不会正确地级联删除命令。如果我尝试删除用户,则级联操作可以正常工作,不会抛出任何异常。
orphanRemoval
?Obs。:使用(Hibernate 4.3.7)作为提供者