Java memiliki transient
kata kunci. Mengapa JPA memiliki @Transient
alih - alih hanya menggunakan kata kunci java yang sudah ada?
java
jpa
jakarta-ee
annotations
transient
deamon
sumber
sumber
Karena mereka memiliki arti yang berbeda. The
@Transient
penjelasan memberitahu penyedia JPA untuk tidak bertahan apapun (nontransient
) atribut. Yang lain memberitahu kerangka serialisasi untuk tidak membuat serialisasi atribut. Anda mungkin ingin memiliki@Transient
properti dan masih membuat cerita bersambung.sumber
Seperti yang dikatakan orang lain,
@Transient
digunakan untuk menandai bidang yang tidak boleh dipertahankan. Perhatikan contoh singkat ini:Ketika kelas ini diumpankan ke JPA, ia bertahan
gender
danid
tetapi tidak mencoba untuk bertahan metode boolean pembantu - tanpa@Transient
sistem yang mendasarinya akan mengeluh bahwa kelas EntitasPerson
hilangsetMale()
dansetFemale()
metode dan dengan demikian tidak akan bertahanPerson
sama sekali.sumber
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 dengantransient
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:The
Solution
kelas akan terlihat seperti ini:Server tetap masing
ProgressReport
- masing ke database-nya. Server tidak peduli untuk bertahanestimatedMinutesRemaining
, tetapi klien tentu peduli dengan informasi ini. Oleh karena itu,estimatedMinutesRemaining
dijelaskan menggunakan@Transient
. Ketika finalSolution
ditemukan oleh algoritma, itu dipertahankan oleh JPA secara langsung tanpa menggunakan aProgressReport
.sumber
@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 menggunakantransient
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 JavaSEtransient
. Jadi penerima yang menggunakan VM lain dapat menghemat waktu mereka untuk menghitung ulang lagi.sumber
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.
sumber