Мне кажется, что добавление полей, помеченных аннотацией @Transient, к объекту очень чревато ошибками. Я прав?

У меня есть некоторое философское интуитивное ощущение, что добавление полей, которые не отображаются в БД, портит классы сущностей и является неправильным способом решения проблем.

Но существуют ли какие-либо конкретные ситуации, когда использование @Transient полей приводит к неявным и трудно решаемым проблемам?

Например, возможно ли, что добавление или удаление кеша 2-го уровня нарушит работу нашего приложения, если в наших сущностях есть @Transient поля?

Значительное обновление: после некоторого размышления над @Transient полями мне кажется, что @Transient поля просто нужно использовать должным образом.

Под «правильным способом» я подразумеваю, что сущность всегда должна вести себя одинаково. Это означает, что это очень подвержено ошибкам поведение, когда геттеры время от времени возвращают null в зависимости от значения поля @Transient. А это значит, что поля @Transient всегда нужно инициализировать.

И я вижу только 2 случая правильного использования:

  1. Поля @Transient должны быть инициализированы в конструкторе объекта:

    @Entity
    public class SomeEntity
       @Id
       private long id;
    
       @Transient
       private String transientField;
    
       public SomeEntity () {
          transientField = "some string";
       }       
       ...
    }
    
  2. Поля @Transient могут быть инициализированы лениво:

    @Entity
    public class SomeEntity
       @Id
       private long id;
    
       @Transient
       private String transientField;
    
       public String getTransientField () {
          synchronized (lock) {
             if (transientField == null) {
                transientField = "some string";
             }   
          }
          return transientField;
       }       
       ...
    }
    

Может ли кто-нибудь прокомментировать эти 2 случая или описать другие случаи, которые я пропустил?


person Roman    schedule 28.05.2010    source источник
comment
Когда вы говорите философский, вы имеете в виду интуитивный?   -  person Ed Guiness    schedule 28.05.2010


Ответы (1)


Я использую аннотацию Transient в некоторых проектах, которые также сохраняются в спящем режиме и пока не имеют никаких проблем.

Обычно он используется для полей, которые могут быть определены другими постоянными свойствами, и использование кеша также должно работать, потому что механизмы сериализации Javas (кеши обычно ожидают, что кэшированные объекты будут сериализованы) также учитывают аннотацию Transient. Я думаю, что предпочтительнее использовать временные свойства получения и установки, которые предоставляют информацию, вместо полей экземпляра, когда это возможно.

person Daff    schedule 28.05.2010