Jawaban:
transientKata kunci Java digunakan untuk menyatakan bahwa suatu bidang tidak harus diserialisasi, sedangkan @Transientanotasi JPA digunakan untuk menunjukkan bahwa suatu bidang tidak akan bertahan dalam database, yaitu semantiknya berbeda.
Karena mereka memiliki arti yang berbeda. The @Transientpenjelasan memberitahu penyedia JPA untuk tidak bertahan apapun (non transient) atribut. Yang lain memberitahu kerangka serialisasi untuk tidak membuat serialisasi atribut. Anda mungkin ingin memiliki @Transientproperti dan masih membuat cerita bersambung.
Seperti yang dikatakan orang lain, @Transientdigunakan 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 genderdan idtetapi tidak mencoba untuk bertahan metode boolean pembantu - tanpa @Transientsistem yang mendasarinya akan mengeluh bahwa kelas Entitas Personhilang setMale()dan setFemale()metode dan dengan demikian tidak akan bertahan Personsama sekali.
Tujuannya berbeda:
Kata transientkunci dan @Transientanotasi 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 transientkunci adalah kondisi yang lebih kuat daripada @Transient:
Jika bidang menggunakan transientkata kunci, bidang itu tidak akan diserialisasi ketika objek dikonversi ke aliran byte. Selain itu, karena JPA memperlakukan bidang yang ditandai dengan transientkata kunci sebagai @Transientanotasi, bidang tersebut tidak akan bertahan oleh JPA juga.
Di sisi lain, bidang yang dianotasi @Transientsaja akan dikonversi ke aliran byte saat objek tersebut diserialisasi, tetapi tidak akan bertahan oleh JPA. Karenanya, transientkata kunci adalah kondisi yang lebih kuat daripada @Transientanotasi.
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 ProgressReportobjek:
@Entity
public class ProgressReport implements Serializable{
private static final long serialVersionUID = 1L;
@Transient
long estimatedMinutesRemaining;
String statusMessage;
Solution currentBestSolution;
}
The Solutionkelas 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, estimatedMinutesRemainingdijelaskan menggunakan @Transient. Ketika final Solutionditemukan 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"). "
transientbidang secara implisit memiliki @Transientanotasi. Jadi, jika Anda menggunakan transientkata 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.