Jawaban:
transient
Kata kunci Java digunakan untuk menyatakan bahwa suatu bidang tidak harus diserialisasi, sedangkan @Transient
anotasi JPA digunakan untuk menunjukkan bahwa suatu bidang tidak akan bertahan dalam database, yaitu semantiknya berbeda.
Karena mereka memiliki arti yang berbeda. The @Transient
penjelasan memberitahu penyedia JPA untuk tidak bertahan apapun (non transient
) atribut. Yang lain memberitahu kerangka serialisasi untuk tidak membuat serialisasi atribut. Anda mungkin ingin memiliki @Transient
properti dan masih membuat cerita bersambung.
Seperti yang dikatakan orang lain, @Transient
digunakan untuk menandai bidang yang tidak boleh dipertahankan. Perhatikan contoh singkat ini:
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);
}
}
Ketika kelas ini diumpankan ke JPA, ia bertahan gender
dan id
tetapi tidak mencoba untuk bertahan metode boolean pembantu - tanpa @Transient
sistem yang mendasarinya akan mengeluh bahwa kelas Entitas Person
hilang setMale()
dan setFemale()
metode dan dengan demikian tidak akan bertahan Person
sama sekali.
Tujuannya berbeda:
Kata transient
kunci dan @Transient
anotasi memiliki dua tujuan yang berbeda: satu berurusan dengan serialisasi dan satu berurusan dengan kegigihan . Sebagai programmer, kita sering menggabungkan dua konsep ini menjadi satu, tetapi ini umumnya tidak akurat. Ketekunan mengacu pada karakteristik negara yang hidup lebih lama dari proses yang menciptakannya. Serialisasi di Jawa mengacu pada proses pengkodean / decoding keadaan objek sebagai aliran byte.
Kata transient
kunci adalah kondisi yang lebih kuat daripada @Transient
:
Jika bidang menggunakan transient
kata kunci, bidang itu tidak akan diserialisasi ketika objek dikonversi ke aliran byte. Selain itu, karena JPA memperlakukan bidang yang ditandai dengan transient
kata kunci sebagai @Transient
anotasi, bidang tersebut tidak akan bertahan oleh JPA juga.
Di sisi lain, bidang yang dianotasi @Transient
saja akan dikonversi ke aliran byte saat objek tersebut diserialisasi, tetapi tidak akan bertahan oleh JPA. Karenanya, transient
kata kunci adalah kondisi yang lebih kuat daripada @Transient
anotasi.
Contoh
Ini menimbulkan pertanyaan: Mengapa ada orang yang ingin membuat serial suatu bidang yang tidak bertahan ke database aplikasi? Kenyataannya adalah bahwa serialisasi digunakan untuk lebih dari sekedar kegigihan . Dalam aplikasi Enterprise Java perlu ada mekanisme untuk bertukar objek antara komponen yang didistribusikan ; serialisasi menyediakan protokol komunikasi umum untuk menangani hal ini. Dengan demikian, suatu bidang dapat menyimpan informasi penting untuk tujuan komunikasi antar-komponen; tetapi bidang yang sama itu mungkin tidak memiliki nilai dari perspektif kegigihan.
Misalnya, anggap algoritma pengoptimalan dijalankan di server, dan anggap algoritma ini membutuhkan waktu beberapa jam untuk menyelesaikannya. Bagi seorang klien, memiliki rangkaian solusi paling baru adalah penting. Jadi, klien dapat berlangganan ke server dan menerima pembaruan berkala selama fase eksekusi algoritma. Pembaruan ini disediakan menggunakan ProgressReport
objek:
@Entity
public class ProgressReport implements Serializable{
private static final long serialVersionUID = 1L;
@Transient
long estimatedMinutesRemaining;
String statusMessage;
Solution currentBestSolution;
}
The Solution
kelas akan terlihat seperti ini:
@Entity
public class Solution implements Serializable{
private static final long serialVersionUID = 1L;
double[][] dataArray;
Properties properties;
}
Server tetap masing ProgressReport
- masing ke database-nya. Server tidak peduli untuk bertahan estimatedMinutesRemaining
, tetapi klien tentu peduli dengan informasi ini. Oleh karena itu, estimatedMinutesRemaining
dijelaskan menggunakan @Transient
. Ketika final Solution
ditemukan oleh algoritma, itu dipertahankan oleh JPA secara langsung tanpa menggunakan a ProgressReport
.
@Unpersisted
,.
@Ephemeral
. Menurut Merriam Webster: Ketika ephemeral pertama kali dicetak dalam bahasa Inggris pada 1600-an, "itu adalah istilah ilmiah yang diterapkan pada demam jangka pendek, dan kemudian, untuk organisme (seperti serangga dan bunga) dengan masa hidup yang sangat singkat. Segera setelah itu , ia memperoleh pengertian luas yang merujuk pada apa pun yang berlalu sebentar dan berumur pendek (seperti dalam "kesenangan sesaat"). "
transient
bidang secara implisit memiliki @Transient
anotasi. Jadi, jika Anda menggunakan transient
kata kunci untuk mencegah serialisasi suatu bidang maka itu tidak akan berakhir di basis data juga.
Jika Anda hanya ingin bidang tidak bertahan, baik transient dan @Transient berfungsi. Tetapi pertanyaannya adalah mengapa @ Trransient sejak transient sudah ada.
Karena bidang @Transient masih akan mendapatkan serial!
Misalkan Anda membuat entitas, melakukan perhitungan yang menghabiskan CPU untuk mendapatkan hasil dan hasil ini tidak akan disimpan dalam database. Tetapi Anda ingin mengirim entitas ke aplikasi Java lain untuk digunakan oleh JMS, maka Anda harus menggunakan @Transient
, bukan kata kunci JavaSE transient
. Jadi penerima yang menggunakan VM lain dapat menghemat waktu mereka untuk menghitung ulang lagi.
Saya akan mencoba menjawab pertanyaan "mengapa". Bayangkan situasi di mana Anda memiliki database besar dengan banyak kolom dalam sebuah tabel, dan proyek / sistem Anda menggunakan alat untuk menghasilkan entitas dari database. (Hibernate memiliki itu, dll ...) Sekarang, anggaplah dengan logika bisnis Anda, Anda perlu bidang tertentu TIDAK untuk bertahan. Anda harus "mengkonfigurasi" entitas Anda dengan cara tertentu. Sementara kata kunci Transient berfungsi pada objek - karena berperilaku dalam bahasa java, @Transient hanya dirancang untuk menjawab tugas-tugas yang hanya berkaitan dengan tugas-tugas yang bertahan lama.