Могут ли свойства, отображаемые в hbm.xml, быть временными? - PullRequest
5 голосов
/ 28 декабря 2011

Предположим, у меня есть User сущность, подобная этой:

class User {
    private String login;
    transient private String hashedPassword;
}

Я не хочу когда-либо передавать hashedPassword клиентам, поэтому я делаю ее временной.

Этокласс отображается в Hibernate, оба поля отображаются в hbm.xml.

Является ли эта реализация безопасной и правильной?Будет ли Hibernate правильно хранить hashedPassword в базе данных, загружать его в объекты из базы данных, хранить в реплицированном кеше 2-го уровня и локальном кеше сеанса и т. Д.в любом случае или полностью игнорировать это?

РЕДАКТИРОВАТЬ : я уже получил два ответа, которые, кажется, не включают в себя один конкретный аспект уравнения.Я вообще не использую аннотации, только сопоставления XML в hbm.xml.И это Java-переходное поле сопоставлено с OR в hbm.xml.

Ответы [ 3 ]

7 голосов
/ 28 декабря 2011

Несопоставленные / временные свойства не сохраняются в спящем режиме .

Hibernate понимает важность стандартных java-переходных модификаторов - но также позволяет вам аннотировать свойства как переходные, используя аннотацию @Transient, если вы так решите ... Или просто вообще не указывать поле в файле отображения.

В вашем случае вам, вероятно, НЕ потребуется делать что-то особенное, hibernate должен просто "делать правильные вещи", игнорируя не отображенные поля.

Итак: урок, усвоенный здесь -

Если используется только hbm.xml

1) Нераспределенные свойства не сохраняются в режиме гибернации - они эффективно переходные.

При использовании POJO

2) Hibernate игнорирует сохранение аннотированных переменных @Transient:

@Transient
int ignored=0;

3) Hibernate также игнорирует сохранениепеременные со стандартными «переходными» модификаторами:

private transient int ignored =0;

См. http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ для превосходного объяснения этого.

3 голосов
/ 28 декабря 2011

Похоже, что Hibernate не сохранит поле с ключевым словом transient, независимо от того, какие у вас есть другие аннотации.

Отдельная аннотация @Transient позволит вам настроить Hibernate на игнорирование непереходного поля для персистентности, но я не думаю, что можно сделать обратное, если Hibernate сохранит поле transient.

Подобное обсуждение здесь:

JPA - использование аннотаций в модели

Аннотация @Basic к переходным переменным

Наиболее релевантная цитата, приведенная выше, из спецификации JPA 2.0: «Аннотации сопоставления не должны применяться к полям или свойствам transient или @Transient».

0 голосов
/ 28 декабря 2011

Вот что я думаю - Hibernate - это просто картографическая технология. Когда вы помечаете поле как переходное, оно не будет сохраняться в Java. А поскольку его состояние не сохраняется, почему Hibernate должен поддерживать его в кэше L2 и т. Д.? поэтому hibernate не должен иметь проблем, даже если вы отобразите временное поле в файле hbm.

...