使用Hibernate时@Immutable和@Entity(mutable = false)之间有什么不同

non*_*tor 18 java entity hibernate jpa immutability

两者有什么区别?

是否应该在一个实体上使用一个或两个?

Chs*_*y76 18

对于实体来说,实际上没有区别.@Immutable获得优先权(即如果你有一个实体,它被注释为@Immutable,@Entity(mutable = "true")它将被视为不可变的).

@Immutable也可以用于具有几乎相同语义的集合.细节在这里


Vla*_*cea 12

org.hibernate.annotations.Entity批注已弃用,将在Hibernate的未来版本中删除.

因此,@Immutabale如果您拥有永远不应被Hibernate修改的实体,则应始终使用注释.

正如我在本文中解释的那样,@Immutable注释告诉Hibernate以只读模式加载实体,因此脏检查机制无法跟踪实体修改.

但是,@Immutable仍可通过JPQL或Criteria API批量更新查询更新实体.

为了确保@Immutabale实体永远不会被修改为批量更新查询,从Hibernate 5.2.17开始,您可以设置以下配置属性:

<property
    name="hibernate.query.immutable_entity_update_query_handling_mode"
    value="exception"
/>
Run Code Online (Sandbox Code Playgroud)

使用此属性后,批量更新查询将最终抛出异常,并且将阻止实体更新.