我在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
来自JavaDoc for 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
答案 0 :(得分:10)
Hibernate会将标记为“可变”的类型视为可以更改(即需要更新),而指向新引用。如果为Hibernate加载属性分配一个新引用,即使类型是不可变的,Hibernate也会识别它 - 这种情况一直发生在例如String字段中。 但是,如果你有一个StringBuilder字段并将其标记为 immutable ,如果你修改了StringBuilder,Hibernate会不注意。
有关详细信息和示例项目,请参阅this blog post。
答案 1 :(得分:2)
这里的典型示例是String类 - 它是不可变的,即一旦创建了字符串,就无法更改其内容或状态,如果您愿意,那么您将不得不将其处理为新副本。
isMutable返回true意味着你说这个对象可以通过外部对象更改其状态,返回false意味着你必须将这个对象复制到一个新实例,以便将改变状态记录下来。或者正如你所说:“它是否意味着持有对此类实例的引用的对象永远不会指向不同的实例”。