如何在不删除拥有实体的情况下删除 Hibernate 中的可选实体?

时间:2021-07-22 02:25:21

标签: java spring hibernate jpa

Hibernate 似乎强制执行实体之间的强制关系。但是,我有一个 User 实体和一个 Portfolio 实体。每个 User 可以有 0 个或 1 个投资组合(但每个 Portfolio 必须有一个 User)。因此,User 应该能够删除 Portfolio 而不删除 User 实体。到目前为止,我无法达到这个结果。相反,如果 User 删除他/她的 PortfolioUser 也会被删除。

如何修改我的注释以达到预期的结果?

-用户

/*
 * 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
}

1 个答案:

答案 0 :(得分:1)

问题在于您的投资组合实体中配置的级联。

通过将cascade = CascadeType.ALL 设置为hibernate,当一个Portfolio 被删除时,它应该在cascade 上删除相关的用户。

在这种情况下,您可以删除该关系中的级联,并保留 User.portfolio 关系中的级联,因为您希望在删除用户时删除投资组合。