Pertanyaannya ada di judul. Di bawah ini saya baru saja menggambarkan beberapa pemikiran dan temuan saya.
Ketika saya memiliki model domain yang sangat sederhana (3 tabel tanpa hubungan apa pun) semua entitas saya TIDAK mengimplementasikan Serializable.
Tetapi ketika model domain menjadi lebih kompleks saya mendapat RuntimeException yang mengatakan bahwa salah satu entitas saya tidak mengimplementasikan Serializable.
Saya menggunakan Hibernate sebagai implementasi JPA.
Aku penasaran:
- Apakah itu persyaratan / perilaku khusus vendor?
- Apa yang terjadi dengan entitas serializable saya? Haruskah serial dapat disimpan atau disimpan?
- Pada saat mana menjadi perlu untuk membuat entitas saya serializable?
Serializable
dua konsep yang berbeda.Menurut JPA Spec:
"JSR 220: Enterprise JavaBeansTM, Versi 3.0 Java Persistence API Versi 3.0, Rilis Final 2 Mei 2006"
sumber
Serializable
bisa membantu dengan itu, dan dalam konteks kegigihan lebih konsisten daripadaCloneable
misalnya.Anda membutuhkan entitas Anda
Serializable
Anda jika Anda perlu mentransfernya secara over-the-wire (cerita bersambung ke beberapa representasi lain), menyimpannya dalam sesi http (yang kemudian serial ke hard disk oleh wadah servlet), dll.Hanya demi kegigihan,
Serializable
tidak diperlukan, setidaknya dengan Hibernate. Tapi itu adalah praktik terbaik untuk membuatnyaSerializable
.sumber
Menurut dokumen hibernasi , saat menggunakan penjelasan @JoinColumn:
sumber
Untuk melengkapi jawaban bagus Conor yang merujuk pada spesifikasi JSR-317. Biasanya, proyek EAR terdiri dari modul EJB dengan EJB diekspos melalui antarmuka jarak jauh. Dalam hal ini, Anda perlu membuat kacang entitas Anda serializable karena diagregasi dalam EJB jarak jauh dan dibuat untuk dihubungkan melalui jaringan.
Proyek perang JEE6 tanpa CDI: dapat mengandung EJB lite yang didukung oleh entitas JPA yang tidak dapat diserialisasi.
Proyek perang JEE6 dengan CDI: Kacang yang menggunakan cakupan sesi, aplikasi, atau percakapan harus serial, tetapi kacang yang menggunakan ruang lingkup permintaan tidak harus serial. Jadi entitas JPA yang mendasari kacang - jika ada - akan mengikuti semantik yang sama.
sumber
Jika kita hanya berbicara tentang kegigihan,
Serializable
tidak diperlukan. Tetapi merupakan praktik terbaik untuk membuat entitasSerializable
.Jika kita mengekspos
domain
/entities
objek yang langsung terpapar ke lapisan presentasi, alih-alih menggunakanDTO
, Dalam hal ini kita perlu menerapkanSerializable
. Objek domain ini dapat disimpanHTTPSession
untuk tujuan caching / optimisasi. Sesi http dapat diserialisasi atau dikelompokkan. Dan itu juga diperlukan untuk mentransfer data antar-JVM
keadaan.Ketika kita gunakan
DTO
untuk memisahkan lapisan kegigihan dan lapisan layanan, menandai objek domain sebagaiSerializable
kontra produktif dan akan melanggar "encapsulation
". Maka itu menjadi anti-pola.Pengidentifikasi komposit
Kelas kunci utama harus serial.
Model POJO
Jika instance entitas akan digunakan dari jarak jauh sebagai objek terpisah, kelas entitas harus mengimplementasikan
Serializable
antarmuka.Cache
Selain itu, jika Anda menerapkan
clustered
level keduacache
maka entitas Anda harusserializable
. Pengidentifikasi harusSerializable
karena itu adalah persyaratan JPA karenaidentifier
mungkin digunakan sebagai kunci untuk entri cache tingkat kedua.Dan ketika kita membuat serial entitas memastikan untuk memberikan eksplisit
serialVersionUID
dengan pengubah akses pribadi. Karena jika suatuserializable
kelas tidak secara eksplisit mendeklarasikan aserialVersionUID
, maka runtime serialisasi akan menghitungserialVersionUID
nilai default untuk kelas tersebut berdasarkan berbagai aspek kelas, seperti yang dijelaskan dalam Spesifikasi Serialisasi Objek Java (TM).serialVersionUID
Komputasi default sangat sensitif terhadap detail kelas yang dapat bervariasi tergantung pada implementasi kompiler, dan dengan demikian dapat mengakibatkan hal yang tidak terdugaInvalidClassExceptions
selama deserialisasi.sumber
Saya percaya masalah Anda terkait dengan memiliki bidang tipe kompleks (kelas) yang tidak dijelaskan. Dalam kasus seperti itu penanganan default akan menyimpan objek dalam bentuk serial di database (yang mungkin bukan yang Anda maksudkan) Contoh:
Dalam kasus di atas, CustomerData akan disimpan dalam bidang array byte dalam database dalam bentuk serial.
sumber
Spesifikasi JPA
Menurut spesifikasi JPA, suatu entitas harus menerapkan
Serializable
hanya jika perlu diteruskan dari satu JVM ke yang lain atau jika entitas tersebut digunakan oleh Stateful Session Bean yang perlu dipasivasi oleh wadah EJB.Hibernasi
Hibernate hanya membutuhkan atribut entitas
Serializable
, tetapi bukan entitas itu sendiri.Namun, dengan menerapkan spesifikasi JPA, semua persyaratan JPA mengenai
Serializable
entitas juga berlaku untuk Hibernate.Kucing jantan
Menurut dokumentasi Tomcat ,
HttpSession
atributnya juga harusSerializable
:Jadi, jika entitas disimpan dalam
HttpSession
, itu harus diimplementasikanSerializable
.sumber
Kelas harus mengimplementasikan Serializable jika Anda ingin membuat cerita bersambung. Ini tidak terkait langsung dengan JPA dan spesifikasi JPA tidak mengharuskan entitas serializable. Jika Hibernate benar-benar mengeluh tentang ini, saya kira itu adalah bug Hibernate, tapi saya kira Anda secara langsung atau tidak langsung melakukan sesuatu yang lain dengan entitas, yang mengharuskan mereka untuk serial.
sumber
Silakan merujuk http://www.adam-bien.com/roller/abien/entry/do_jpa_entities_have_to mengatakan, Implementasi java.io.Serializable hanya diperlukan untuk mentransfer data melalui IIOP atau JRMP (RMI) antara instance JVM. Dalam kasus aplikasi web murni objek domain kadang-kadang disimpan dalam HTTPSession untuk tujuan caching / optimasi. Sesi http dapat diserialisasi (pasif) atau dikelompokkan. Dalam kedua kasus semua konten harus Serializable.
sumber
hit jarak jauh menggunakan tukang pos atau ajax atau angular js dll ....., dapat menyebabkan siklus berulang dengan pengecualian StackOverflow dengan Jackson fastxml. Jadi, lebih baik menggunakan serializer.
sumber
Menerapkan ehcache dengan diskstore sebagai cache level kedua (yaitu menggunakan
@Cacheable
anotasi entitas atau metode repositori / layanan) memerlukan Serializable, jika tidak cache akan gagal (NotSerializableException
) untuk menulis entitas ke cache disk.sumber
Ini juga merupakan kesalahan yang dilemparkan ketika Anda memberikan ID yang salah ketik sebagai param kedua untuk sesuatu seperti em.find () (yaitu dengan meneruskan entitas itu sendiri daripada ID-nya). Saya belum merasa perlu untuk benar-benar mendeklarasikan entitas JPA serializable - itu tidak benar-benar diperlukan kecuali jika Anda menggunakan referencedColumnName seperti yang dijelaskan oleh aman.
sumber
ketika entitas JPA digunakan sebagai parameter atau mengembalikan nilai oleh operasi EJB jarak jauh
sumber