【问题标题】:Creating a custom Hibernate UserType - What does isMutable() mean?创建自定义 Hibernate UserType - isMutable() 是什么意思?
【发布时间】:2008-10-22 04:21:10
【问题描述】:

我正在 Hibernate 中为一个项目创建自定义 UserType。在我使用 isMutable 方法之前,它一直相对简单。我试图弄清楚这种方法在合同方面意味着什么。

这是否意味着我正在为其创建 UserType 的类是不可变的,还是意味着持有对此类实例的引用的对象永远不会指向不同的实例?

我在 Hibernate Community Wiki 中找到了一些示例,它们返回 true,因为对象本身是可变的 - http://www.hibernate.org/73.html

社区 wiki 中的其他示例返回 false 并没有说明原因,尽管它们也是可变的。

我查过JavaDoc,但也不是很清楚。

来自UserType 的 JavaDoc:

public boolean isMutable()
    Are objects of this type mutable?
    Returns:
        boolean

来自Type的JavaDoc:

public boolean isMutable()
    Are objects of this type mutable. (With respect to the referencing
    object ... entities and collections are considered immutable because
    they manage their own internal state.)
    Returns:
        boolean

【问题讨论】:

  • 链接不再有效,仅供参考

标签: java hibernate orm


【解决方案1】:

Hibernate 会将标记为“可变”的类型视为可以更改(即需要 UPDATE) 指向新的引用。如果您为 Hibernate 加载的属性分配新引用,即使类型是不可变的,Hibernate 也会识别这一点 - 例如,字符串字段会一直发生这种情况。 但是,如果您有一个 StringBuilder 字段并将其标记为不可变,如果您修改了 StringBuilder,Hibernate 将不会注意到。

有关更多详细信息和示例项目,请参阅this blog post

【讨论】:

    【解决方案2】:

    这里的典型示例是 String 类 - 它是不可变的,即一旦创建了字符串,您就无法更改其内容或状态,如果您愿意,则必须将其处理为新副本。

    isMutable 返回 true 意味着您说这个对象可以通过外部对象更改其状态,返回 false 意味着您必须将此对象复制到一个新实例,并在此过程中对状态进行更改。或者正如你所说:“这是否意味着持有对此类实例的引用的对象永远不会指向不同的实例”。

    【讨论】:

    • 在 Type.isMutable() 的 JavaDoc 中,他们说将数组标记为不可变。但这似乎与您所说的相矛盾,因为数组可以通过外部对象更改其状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多