创建自定义的Hibernate UserType - isMutable()是什么意思?

9
我正在为一个项目在Hibernate中创建自定义UserType。这一过程相对简单,直到我遇到了isMutable方法。我试图弄清楚这个方法的合同意义。
这是指我为其创建UserType的类是不可变的,还是指持有对此类实例引用的对象永远不会指向不同的实例?
我在Hibernate社区Wiki中找到了一些示例,其中他们返回true,因为对象本身是可变的-http://www.hibernate.org/73.html
社区维基中的其他示例返回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

1
链接已失效,供您参考。 - Jackie
2个回答

11

Hibernate将标记为“可变”的类型视为可能会更改(即需要进行UPDATE)而不指向新引用。如果您给Hibernate加载的属性分配一个新引用,即使该类型是不可变的,Hibernate也会识别此操作 - 这通常发生在String字段上。

但是,如果您有一个StringBuilder字段并将其标记为不可变,则无论您如何修改StringBuilder,Hibernate都不会注意到。

有关更多详细信息和样本项目,请参见此博客文章


2
典型的例子是字符串类 - 它是不可变的,即一旦创建了字符串,就不能更改其内容或状态,如果想要更改,则必须处理成一个新副本。
isMutable返回true意味着您表示此对象可以由外部对象更改其状态,返回false意味着您将不得不将此对象复制到新实例中,并在其中逐步更改状态。或者如您所说:“它是否意味着持有对此类实例引用的对象永远不会指向不同的实例”。

2
在Type.isMutable()的JavaDoc中,他们说要将数组标记为不可变。但这似乎与您所说的相矛盾,因为数组可以被外部对象更改其状态。 - Johann Zacharee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接