Цель другая:
Ключевое слово transient
и аннотация @Transient
имеют две разные цели: одна имеет дело с сериализацией , а другая - с постоянством . Как программисты, мы часто объединяем эти два понятия в одно, но в целом это не совсем точно. Постоянство относится к характеристике состояния, которая переживает процесс, который его создал. Сериализация в Java относится к процессу кодирования / декодирования состояния объекта как байтового потока.
Ключевое слово transient
является более строгим условием, чем @Transient
:
Если в поле используется ключевое слово transient
, это поле не будет сериализовано при преобразовании объекта в поток байтов. Кроме того, поскольку JPA рассматривает поля, помеченные ключевым словом transient
, как аннотацию @Transient
, JPA также не сохранит это поле.
С другой стороны, аннотированные поля @Transient
отдельно будут преобразованы в поток байтов при сериализации объекта, но JPA не сохранит его. Поэтому ключевое слово transient
является более строгим условием, чем аннотация @Transient
.
Пример
Возникает вопрос: зачем кому-либо хотеть сериализовать поле, которое не сохраняется в базе данных приложения?
Реальность такова, что сериализация используется не только для сохранения . В приложении Enterprise Java должен быть механизм для обмена объектами между распределенными компонентами ; Сериализация обеспечивает общий протокол связи, чтобы справиться с этим. Таким образом, поле может содержать критическую информацию для целей межкомпонентной связи; но это же поле может не иметь значения с точки зрения постоянства.
Например, предположим, что алгоритм оптимизации запущен на сервере, и предположим, что этот алгоритм занимает несколько часов. Для клиента важно иметь самый современный набор решений. Таким образом, клиент может подписаться на сервер и получать периодические обновления на этапе выполнения алгоритма. Эти обновления предоставляются с использованием объекта ProgressReport
:
@Entity
public class ProgressReport implements Serializable{
private static final long serialVersionUID = 1L;
@Transient
long estimatedMinutesRemaining;
String statusMessage;
Solution currentBestSolution;
}
Класс Solution
может выглядеть следующим образом:
@Entity
public class Solution implements Serializable{
private static final long serialVersionUID = 1L;
double[][] dataArray;
Properties properties;
}
Сервер сохраняет каждый ProgressReport
в своей базе данных. Сервер не хочет сохранять estimatedMinutesRemaining
, но клиент, безусловно, заботится об этой информации. Следовательно, estimatedMinutesRemaining
аннотируется с использованием @Transient
. Когда окончательный Solution
определяется алгоритмом, он сохраняется в JPA напрямую, без использования ProgressReport
.