Создание пользовательского Hibernate UserType - Что означает isMutable ()? - PullRequest
8 голосов
/ 22 октября 2008

Я создаю пользовательский тип пользователя в Hibernate для проекта. Это было относительно просто, пока я не пришел к методу isMutable. Я пытаюсь выяснить, что означает этот метод, по контракту.

Означает ли это, что класс, для которого я создаю UserType, является неизменным, или это означает, что объект, содержащий ссылку на экземпляр этого класса, никогда не будет указывать на другой экземпляр?

Я нашел несколько примеров в Hibernate Community Wiki , где они вернули true, потому что сам объект был изменяемым - http://www.hibernate.org/73.html.

Другие примеры в вики сообщества вернули false, не указав причину, хотя они также были изменяемыми.

Я проверил JavaDoc, но это не очень понятно.

Из JavaDoc для Тип пользователя :

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

Из 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

Ответы [ 2 ]

10 голосов
/ 23 ноября 2009

Hibernate будет обрабатывать типы, помеченные как «изменяемые», как если бы они могли измениться (т. Е. Потребовать ОБНОВЛЕНИЕ) без , указывающего на новую ссылку. Если вы назначите новую ссылку для загруженного в Hibernate свойства, Hibernate распознает это, даже если тип неизменен - ​​это происходит постоянно, например, с полями String. Но если, скажем, у вас есть поле StringBuilder и вы пометите его как неизменный Hibernate не заметит, если вы измените StringBuilder.

См. в этом блоге для более подробной информации и примера проекта.

2 голосов
/ 22 октября 2008

Типичным примером здесь является класс String - он неизменный, т. Е. После создания строки вы не можете изменить ее содержимое или состояние, и если вы захотите, вам придется обработать ее в новую копию.

isMutable возвращает true означает, что вы говорите, что у этого объекта может быть изменено его состояние внешними объектами, а возвращение false означает, что вам придется скопировать этот объект в новый экземпляр, создавая изменения состояния по пути. Или, как вы сказали: «означает ли это, что объект, который содержит ссылку на экземпляр этого класса, никогда не будет указывать на другой экземпляр».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...