我有两个实体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也不合适,因为我遇到了删除子节点而不是父节点的情况。
1条答案
按热度按时间iezvtpos1#
在双向Map中,一个实体不知道另一个实体
因此,在双向关系中,我们提到哪个实体端将更新两个表之间的链接。
要保存/删除关联,请保存关系的所有者实体。