使用 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 也适用于集合)。 没有很好的文档记录,没有。 EntityBindersource cmets 描述了上面提到的优先级。【参考方案2】:

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

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

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

但是,@Immutable 实体仍然可以通过JPQLCriteria 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) 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

PureComent要和immutable一起使用

为啥当我第二次使用完全相同的参数调用 IMMUTABLE 函数时,计划时间会加倍?

初探immutable Redux+immutable实现todolist

初探immutable Redux+immutable实现todolist

react---Immutable的基本使用

react---Immutable的基本使用