JPA OneToOne关联场景下,如何删除单表数据不联动删除关联表?
问题
如何删除一个表中的数据而不影响另一个表的数据?例如,我想要删除resume_id为5的数据,该数据关联user_id为12。当前删除resume_id 5时,user_id 12也会被删除,该如何解决?
关联代码如下:
@JsonBackReference(value="resume") @OneToOne(mappedBy = "userinfo", cascade = CascadeType.REMOVE) private EntityResume resume; @JsonManagedReference(value = "resume") @OneToOne(cascade = CascadeType.REMOVE) @JoinColumn(name = "user_id", unique = true) private EntityUserInfo userinfo;
解决方案
问题根源在于你给关联字段配置了cascade = CascadeType.REMOVE——这个级联规则会让你删除主实体时,自动连带删掉关联的实体。要解决这个问题,只需要调整级联类型即可:
- 如果你希望删除
EntityResume时不删除关联的EntityUserInfo,直接移除EntityResume中userinfo字段的CascadeType.REMOVE,或者保留你实际需要的级联操作(比如CascadeType.PERSIST、CascadeType.MERGE这类不会触发删除的类型)。修改后的代码示例:
@JsonManagedReference(value = "resume") @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name = "user_id", unique = true) private EntityUserInfo userinfo;
- 补充说明:
EntityUserInfo中的resume字段是关联关系的被维护端(因为用了mappedBy),这里的CascadeType.REMOVE其实不会生效,级联操作的控制逻辑主要在维护端(也就是EntityResume的userinfo字段)。不过如果后续有其他需求,也可以根据实际情况调整这里的级联配置。
核心逻辑就是:去掉维护端关联字段的CascadeType.REMOVE配置,这样删除resume数据时就不会触发userinfo的删除操作了。
内容的提问来源于stack exchange,提问作者AssylkhanAz
相关产品推荐
相关产品推荐

