使用休眠时,@Immutable和@Entity(可变=false)有什么区别

2022-09-01 17:04:29

如果有的话,两者之间有什么区别?

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


答案 1

对于实体来说,几乎没有区别。 获得优先级(也就是说,如果您有一个同时注释为的实体,并且它将被视为不可变的)。@Immutable@Immutable@Entity(mutable = "true")

@Immutable也可以用于具有几乎相同语义的集合。详情请按此


答案 2

该注释已弃用,并将在Hibernate的未来版本中被删除。org.hibernate.annotations.Entity

因此,如果您有不应由 Hibernate 修改的实体,则应始终使用@Immutabale注释。

注释告诉 Hibernate 以只读模式加载实体,因此脏检查机制无法跟踪实体修改。@Immutable

但是,仍可以通过条件 API 批量更新查询或条件 API 批量更新查询来更新实体。@ImmutableJPQL

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

<property
    name="hibernate.query.immutable_entity_update_query_handling_mode"
    value="exception"
/>

使用此属性后,批量更新查询最终将引发异常,并且实体更新将被阻止。