从Hibernate/JPA中的单向关系中删除子级

6psbrbz9  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(156)

我有两个实体User和Expense,它们通过单向@ManyToMany关系连接。尝试删除用户时,引发引用完整性约束冲突。如果删除用户,我希望发生的情况是:

  • 删除"spentBy"字段中包含该用户的所有费用
  • 不要删除费用,但要删除"spentFor"字段中包含用户的引用。将字段设置为空也足够了

我知道为什么会发生这种情况,问题是什么,但即使在看其他StackOverflow文章,我没有找到一个可以解决我的问题。因为用户没有一个@ManyToMany字段的费用,所有的解决方案,我找到,不工作。
先谢了!
(我删除了所有Lombok吸气剂,设置器的可读性)
我的实体是:

public class Expense {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private double amount;

    @NotNull
    private String name;

    @NotNull
    @OneToOne(fetch = FetchType.EAGER)
    private User spentBy;

    @OnDelete(action = OnDeleteAction.CASCADE)
    @LazyCollection(LazyCollectionOption.FALSE)
    @ManyToMany
    private List<User> spentFor;
public class User implements UserDetails {
    @SequenceGenerator(
        name = "user_sequence",
        sequenceName = "user_sequence",
        allocationSize = 1
    )
    @Id
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE,
        generator = "user_sequence")
    @Column(name = "id", nullable = false)
    private Long id;

    ... (no relation to Expense entity!)

详细的Stacktrace(德语版本,但你可能明白你需要什么):

Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referentielle Integrität verletzt: "FKLECP8QCGQCV5JQGM8FTNMIY0Q: PUBLIC.EXPENSE_SPENT_FOR FOREIGN KEY(SPENT_FOR_ID) REFERENCES PUBLIC.APPLICATION_USER(ID) (CAST(2 AS BIGINT))"
Referential integrity constraint violation: "FKLECP8QCGQCV5JQGM8FTNMIY0Q: PUBLIC.EXPENSE_SPENT_FOR FOREIGN KEY(SPENT_FOR_ID) REFERENCES PUBLIC.APPLICATION_USER(ID) (CAST(2 AS BIGINT))"; SQL statement:
delete from application_user where id=? [23503-214]

我已经尝试过使用@OnDelete注解,但这没有改变任何东西。而且cascade = CascadeType. ALL也不合适,因为我遇到了删除子节点而不是父节点的情况。

iezvtpos

iezvtpos1#

在双向Map中,一个实体不知道另一个实体
因此,在双向关系中,我们提到哪个实体端将更新两个表之间的链接。
要保存/删除关联,请保存关系的所有者实体。

相关问题