使用 Hibernate 时 @Immutable 和 @Entity(mutable=false) 有啥区别
Posted
技术标签:
【中文标题】使用 Hibernate 时 @Immutable 和 @Entity(mutable=false) 有啥区别【英文标题】:What is the difference between @Immutable and @Entity(mutable=false) when using Hibernate使用 Hibernate 时 @Immutable 和 @Entity(mutable=false) 有什么区别 【发布时间】:2010-12-08 02:32:40 【问题描述】:如果有的话,两者有什么区别?
应该在一个实体上使用一个或两个?
【问题讨论】:
【参考方案1】:entity 几乎没有区别。 @Immutable
获得优先权(也就是说,如果您的实体同时被注释为 @Immutable
和 @Entity(mutable = "true")
,它将被视为不可变)。
@Immutable
也可以用于具有几乎相同语义的集合。详情here
【讨论】:
是的,我打印了同一个文档,但它并没有区分 2,只是说明它们是什么以及它们可以做什么,在这种情况下,它们都对实体做同样的事情(@immutable
也适用于集合)。
没有很好的文档记录,没有。 EntityBinder
source cmets 描述了上面提到的优先级。【参考方案2】:
org.hibernate.annotations.Entity
注释已被弃用,并将在 Hibernate 的未来版本中删除。
因此,如果您有不应被 Hibernate 修改的实体,则应始终使用 @Immutabale
注释。
@Immutable
注释告诉 Hibernate 以只读模式加载实体,因此脏检查机制无法跟踪实体修改。
但是,@Immutable
实体仍然可以通过JPQL
或Criteria API
批量更新查询进行更新。
为了确保 @Immutabale
实体永远不会针对批量更新查询进行修改,从 Hibernate 5.2.17 开始,您可以设置以下配置属性:
<property
name="hibernate.query.immutable_entity_update_query_handling_mode"
value="exception"
/>
有了这个属性,批量更新查询最终会抛出异常,实体更新将被阻止。
【讨论】:
嗨@Vlad Mihalcea - 我想我知道答案,但是有没有办法在定期更新@Immutable 时抛出异常? (而不是仅仅忽略更新) 这是个好主意。您应该为它打开一个 Jira 问题并提供一个带有修复的拉取请求。我不再为 Red Hat 工作,所以我无法为您提供帮助。 谢谢@Vlad Mihalcea。 BTW 恭喜你成为 Java 冠军,当之无愧。 非常感谢以上是关于使用 Hibernate 时 @Immutable 和 @Entity(mutable=false) 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我第二次使用完全相同的参数调用 IMMUTABLE 函数时,计划时间会加倍?
初探immutable Redux+immutable实现todolist