java - Spring data - 删除与视图相关的抑制
问题描述
所以我有两个实体:
@Getter
@Setter
@Entity
@Table(name = "MY_TABLE")
public class MyTable {
@Id
@Column(nullable = false, length = 18)
@SequenceGenerator(name = "MY_TABLE_seq", sequenceName = "MY_TABLE_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_TABLE_seq")
private long id;
@OneToOne(mappedBy = "myTable")
private MyTableView myTableView;
}
还有一个不可变实体(原因是它是一个数据库视图):
@Entity
@Getter
@Immutable
@Table(name = "MY_TABLE_VIEW")
public class MyTableView {
@Id
@Column(name = "ID", nullable = false, length = 18)
private Long id;
@OneToOne
@MapsId
@JoinColumn(name = "id")
private MyTable myTable;
}
更新和创建 MyTable 没有问题。当我尝试删除 MyTable 时,问题就开始了。我正在为此使用存储库:
public interface MyTableRepository extends CrudRepository<MyTable,Long> {
}
在我使用的服务中:
public void deleteMyTable(Long id){
/*fetch the my table enity*/
myTableRepository.delete(myTable);
}
什么都没发生。一点也不例外。我尝试的是更改 @OneToOne 映射。具有不同的级联:
@OneToOne(mappedBy = "myTable",cascade = CascadeType.ALL)
@OneToOne(mappedBy = "myTable",cascade = CascadeType.DETACH)
@OneToOne(mappedBy = "myTable",cascade = CascadeType.MERGE)
@OneToOne(mappedBy = "myTable",cascade = CascadeType.REFRESH)
@OneToOne(mappedBy = "myTable",cascade = CascadeType.REMOVE)
@OneToOne(mappedBy = "myTable",cascade = CascadeType.PERSIST)
- ALL、MERGE 和 REMOVE 抛出和异常,因为我无法从视图中删除
- DETACH、REFRESH 和 PERSIST 什么都不做,但不删除 MyTable 实体
有谁知道如何解决这个问题?
解决方案
如问题评论中所示,我建议您尝试创建某种@PreRemove
钩子以避免该问题。
因为根据实体之间关系的定义方式,它非常有意义。
但是如果你考虑一下,你正在处理一个视图,一个只读实体:在我看来,颠倒关系并创建MyTable
所有者更有意义。此外,它可能会解决这个问题。
请考虑像这样定义您与MyTableView
in 的关系MyTable
:
@OneToOne
@JoinColumn(name = "id", referencedColumnName = "id")
private MyTableView myTableView;
在中,通过以下方式MyTableView
简化您的关系:MyTable
@OneToOne(mappedBy = "myTableView")
private MyTable myTable;
推荐阅读
- python - 在 Django 管理站点中自定义外键下拉列表
- php - 在php数组中删除过去的日期?
- c# - Can't Upload a File to QnaMaker Knowledge Base using SDK
- android - 从某个帧循环 Lottie 动画
- java - 在屏幕帮助上保持形状,无法弄清楚如何跟踪 X、Y 坐标
- python - 共识/集群一组 Python 中的可变长度列表?
- c++ - 使用 cmake 对特定文件进行预验证或后验证
- azure - Azure 逻辑应用,解析 JSON,但可能为空
- ios - 在 tableview 单元格中正确包装文本
- javascript - 首次加载应用程序时,如何在我的所有 .js 文件中设置一些变量?在用户看到之前,我需要这些来按比例分配我的所有屏幕尺寸