У меня такое ощущение, что добавление полей, помеченных аннотацией @Transient к сущности, очень подвержено ошибкам. Я прав? - PullRequest
5 голосов
/ 28 мая 2010

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

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

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

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

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

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

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

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

    @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 случая или описать другие случаи, которые я пропустил?

1 Ответ

1 голос
/ 28 мая 2010

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

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

...