Відповіді:
transient
Ключове слово Java використовується для позначення того, що поле не підлягає серіалізації, тоді як @Transient
анотація JPA використовується для вказівки на те, що поле не слід зберігати в базі даних, тобто їх семантика відрізняється.
Тому що вони мають різні значення. @Transient
Анотацій повідомляє постачальник JPA не зберігаються яким - або (не- transient
) атрибута. Інший говорить про рамки серіалізації, щоб не серіалізувати атрибут. Можливо, ви хочете мати @Transient
властивість і все ще його серіалізувати.
Як уже говорили інші, @Transient
використовується для позначення полів, які не слід зберігати. Розглянемо цей короткий приклад:
public enum Gender { MALE, FEMALE, UNKNOWN }
@Entity
public Person {
private Gender g;
private long id;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public Gender getGender() { return g; }
public void setGender(Gender g) { this.g = g; }
@Transient
public boolean isMale() {
return Gender.MALE.equals(g);
}
@Transient
public boolean isFemale() {
return Gender.FEMALE.equals(g);
}
}
Коли цей клас подається в JPA, він зберігається gender
і id
не намагається зберегти допоміжні булеві методи - без @Transient
базової системи скаржиться, що клас Entity Person
відсутній setMale()
і setFemale()
методи, і, таким чином, взагалі не існуватиме Person
.
Призначення інше:
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, не використовуючи a ProgressReport
.
@Unpersisted
.
@Ephemeral
. За словами Мерріам Вебстер: Коли ефемер вперше був надрукований англійською мовою в 1600-х роках, "це був науковий термін, застосований до короткочасних лихоманків, а пізніше - до організмів (таких як комахи та квіти) з дуже короткими термінами життя. Незабаром після цього , він набув розширеного сенсу, посилаючись на все швидкоплинне і короткочасне (як у «ефемерних задоволеннях») ».
transient
поля як неявні @Transient
анотації. Отже, якщо ви використовуєте transient
ключове слово для запобігання серіалізації поля, воно також не опиниться в базі даних.
Якщо ви просто хочете, щоб поле не залишалося збереженим, і тимчасові, і транзитні роботи. Але питання в тому, чому @Transient, оскільки перехідний, вже існує.
Тому що поле @Transient все ще буде серіалізовано!
Припустимо, ви створили сутність, зробивши певний обчислювач процесора, щоб отримати результат, і цей результат не збережеться в базі даних. Але ви хочете надіслати об'єкт іншим Java-програмам для використання JMS, тоді ви повинні використовувати @Transient
, а не ключове слово JavaSE transient
. Таким чином, приймачі, що працюють на інших VM, можуть заощадити свій час на повторний розрахунок.
Я спробую відповісти на питання "чому". Уявіть ситуацію, коли у вас є величезна база даних з великою кількістю стовпців у таблиці, а ваш проект / система використовує інструменти для генерації об'єктів із бази даних. (У сплячому режимі є такі, і т. Д.) Тепер, припустимо, що за вашою діловою логікою вам потрібно певне поле, яке НЕ слід зберігати. Ви повинні "налаштувати" свою організацію певним чином. Хоча ключове слово Transient працює на об'єкті - оскільки він поводиться в рамках мови java, @Transient призначений лише для відповіді на завдання, що стосуються лише завдань, що зберігаються.