【问题标题】:What is the difference between @Immutable and @Entity(mutable=false) when using Hibernate使用 Hibernate 时 @Immutable 和 @Entity(mutable=false) 有什么区别
【发布时间】:2010-12-08 02:32:40
【问题描述】:

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

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

【问题讨论】:

    标签: java hibernate jpa entity immutability


    【解决方案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 冠军,当之无愧。
    • 非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2011-06-17
    • 2014-02-04
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多