2008-10-22 62 views
8

我创建了一个项目,在Hibernate中自定义的用户类型。直到我接触到isMutable方法时,它一直比较简单。我试图找出这种方法意味着什么,合同明智。创建一个定制的Hibernate UserType - isMutable()是什么意思?

这是否意味着我创建的用户类型为不可变还是意味着持有这一类绝不会指向不同的实例的实例的引用对象的类?

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

在社区维基其他例子不解决,为什么返回false,尽管他们也是可变的。

我检查的JavaDoc,但无论是不是很清楚。

从JavaDoc中UserType

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

从JavaDoc中Type

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

链接不再有效fyi – Jackie 2014-05-21 17:34:42

回答

9

Hibernate会将标记为“可变”的类型视为可以改变(即需要更新)而不指定指向新的引用。如果您分配一个新的参考Hibernate的加载性能Hibernate会认识到这一点,即使类型是不可变的 - 这一切发生的时间,例如,字符串字段。 但是,如果你说有一个StringBuilder字段,并且你将其标记为不可变如果修改StringBuilder,休眠将会而不是通知。

的更多细节和示例项目见this blog post

2

这里最典型的例子是String类 - 这是不变的,即一旦创建了字符串,你不能改变它的内容或状态,如果你想要,那么你将不得不把它处理成一个新的副本。

isMutable返回true意味着你说这个对象可以通过外部对象改变它的状态,返回false意味着你将不得不将这个对象复制到一个新的实例上,使得改变一直沿着状态变化。或者如您所说:“是否意味着持有对此类实例的引用的对象将永远不会指向不同的实例”。

+2

在JavaDoc for Type.isMutable()中,他们说要将数组标记为不可变。但是这似乎与你所说的相矛盾,因为数组可以通过外部对象改变它们的状态。 – 2008-10-22 15:35:31