java - 我应该为不可变的休眠实体使用什么 cascadeType?
问题描述
对于无法修改字段但可以重新分配给新实例的休眠实体属性,我应该使用哪种级联类型?
例子
@ManyToOne(cascade = { CascadeType.REFRESH })
@JoinColumn(name = "ADDRESS_ID", nullable = true)
private Address address;
我们可以为当前对象分配一个新地址,但我们不能修改现有地址的字段,因为地址在数据库中应该是不可变的。我们应该能够与实体一起创建新地址,但不能删除它们。我们应该使用什么 CascadeType?
解决方案
CascadeType 是指应该级联到属性对象的操作。如果你调用EntityManager.persist
,它将级联到属性CascadeType.PERSIST
, for EntityManager.merge
it is CascadeType.MERGE
, for EntityManager.remove
it is CascadeType.REMOVE
, for EntityManager.refresh
it isCascadeType.REFRESH
和 finally for EntityManager.detach
it isCascadeType.DETACH
和 finally。
Address
用于保存的级联类型,即 PERSIST/MERGE 控制是否应在相应操作期间刷新对可通过该属性访问的实体所做的更改。由于您根本不希望此实例是可变的,因此这些级联类型根本没有意义,而且由于它是不可变的,因此 REFRESH 也没有任何意义。
为保证不发生更改,您必须正确封装实体,例如使用字段访问而不公开设置器。
推荐阅读
- php - 使用 PHP 存储 PostgreSQL OID 图像
- r - 在 RMarkdown 中引用同一作者同一年发表的多篇论文
- flyte - 你能有一个没有时间表的有效启动计划吗?
- printing - 有谁知道这是哪种打印机语言?
- angular - Angular 7 + Spring Boot Basic Auth Using HTTPInterceptor - 不调用 API
- python - 熊猫数据框检查行中的数组是否与样本相同
- c++ - C++ 入门 5. ed。不允许使用 lambda 闭包代替函数指针?
- javascript - 为什么 NPM 中有前端框架?
- android - 找不到符号类 RecyclerView 项目侦听器
- amazon-web-services - AmazonDynamoDBClient 出错 - getCredentialsProvider() 函数