Hibernate 似乎强制执行实体之间的强制关系。但是,我有一个 User
实体和一个 Portfolio
实体。每个 User
可以有 0 个或 1 个投资组合(但每个 Portfolio
必须有一个 User
)。因此,User
应该能够删除 Portfolio
而不删除 User
实体。到目前为止,我无法达到这个结果。相反,如果 User
删除他/她的 Portfolio
,User
也会被删除。
如何修改我的注释以达到预期的结果?
-用户
/*
* Each User can have a Portfolio with many Accounts.
*/
@Entity
@Check(constraints = "LENGTH(TRIM(username)) > 0 &&"
+ " LENGTH(TRIM(username)) > 0 &&"
+ " LENGTH(TRIM(email)) > 0 &&"
+ " LENGTH(TRIM(password)) > 10")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Nationalized
@NotNull
private String username;
@Nationalized
@NotNull
private String password;
private String salt;
@Nationalized
@NotNull
private String email;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "user" ,cascade = CascadeType.ALL)
private Portfolio portfolio;
// Not showing constructors, getters, or setters
}
-投资组合
/*
* An Portfolio is a collection of accounts.
*/
@Entity
public class Portfolio {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "portfolio", cascade = CascadeType.ALL)
private List<Account> accounts = new ArrayList<>();
// Not showing constructors, getters, or setters
}
答案 0 :(得分:1)
问题在于您的投资组合实体中配置的级联。
通过将cascade = CascadeType.ALL 设置为hibernate,当一个Portfolio 被删除时,它应该在cascade 上删除相关的用户。
在这种情况下,您可以删除该关系中的级联,并保留 User.portfolio 关系中的级联,因为您希望在删除用户时删除投资组合。