不可变Hibernate实体的关联属性应选用哪种CascadeType级联类型?
问题解决方案
你需要配置CascadeType.PERSIST,搭配你原有需要的CascadeType.REFRESH即可,不需要引入其他级联类型。
配置逻辑说明
CascadeType.PERSIST的作用是:当持久化主实体时,会同步持久化关联的临时状态(未入库的新实例)Address,完全满足你「保存当前实体时同步创建新Address实例」的需求,且该级联仅对新实例生效,不会触发已有Address实例的更新操作,符合Address不可变的要求。- 不需要添加
CascadeType.MERGE:添加后如果误改了已有Address实例的字段,保存主实体会触发Address的更新,违反不可变规则。 - 不需要添加
CascadeType.REMOVE:添加后删除主实体会同步删除关联的Address,不符合你不能级联删除Address的要求。
最终示例配置
@ManyToOne(cascade = { CascadeType.REFRESH, CascadeType.PERSIST }) @JoinColumn(name = "ADDRESS_ID", nullable = true) private Address address;
额外优化建议
你可以给Address实体类添加@Immutable注解,Hibernate会直接忽略所有对Address实例的更新操作,从ORM层面进一步避免误改不可变的Address数据,和级联配置搭配使用安全性更高。
内容的提问来源于stack exchange,提问作者Heschoon
相关产品推荐
相关产品推荐

