首页 > 解决方案 > 我应该为不可变的休眠实体使用什么 cascadeType?

问题描述

对于无法修改字段但可以重新分配给新实例的休眠实体属性,我应该使用哪种级联类型?

例子

    @ManyToOne(cascade = { CascadeType.REFRESH })
    @JoinColumn(name = "ADDRESS_ID", nullable = true)
    private Address address;

我们可以为当前对象分配一个新地址,但我们不能修改现有地址的字段,因为地址在数据库中应该是不可变的。我们应该能够与实体一起创建新地址,但不能删除它们。我们应该使用什么 CascadeType?

标签: javahibernate

解决方案


CascadeType 是指应该级联到属性对象的操作。如果你调用EntityManager.persist,它将级联到属性CascadeType.PERSIST, for EntityManager.mergeit is CascadeType.MERGE, for EntityManager.removeit is CascadeType.REMOVE, for EntityManager.refreshit isCascadeType.REFRESH和 finally for EntityManager.detachit isCascadeType.DETACH和 finally。

Address用于保存的级联类型,即 PERSIST/MERGE 控制是否应在相应操作期间刷新对可通过该属性访问的实体所做的更改。由于您根本不希望此实例是可变的,因此这些级联类型根本没有意义,而且由于它是不可变的,因此 REFRESH 也没有任何意义。

为保证不发生更改,您必须正确封装实体,例如使用字段访问而不公开设置器。


推荐阅读