Saya pada dasarnya mencari anotasi jenis "@Ignore" yang dengannya saya dapat menghentikan bidang tertentu agar tidak bertahan. Bagaimana ini bisa dicapai?
281
@Transient
sesuai dengan kebutuhan Anda.
Untuk mengabaikan bidang, beri keterangan dengan
@Transient
sehingga tidak akan dipetakan oleh hibernate.tapi kemudian jackson tidak akan membuat cerita bersambung lapangan ketika mengkonversi ke JSON.
Jika Anda perlu mencampur JPA dengan JSON (dihilangkan oleh JPA tetapi masih termasuk dalam Jackson) gunakan
@JsonInclude
:TIP:
Anda juga dapat menggunakan JsonInclude.Include.NON_NULL dan sembunyikan bidang di JSON selama deserialisasi ketika
token == null
:sumber
@JsonInclude
itu tidak perlu:@Transient
bidang masih termasuk dalam JSON. (Anda masih mendapatkan suara saya: teknik itu sendiri mungkin sangat berguna dalam keadaan lain).Untuk mengabaikan bidang, beri keterangan dengan
@Transient
sehingga tidak akan dipetakan oleh hibernate.Sumber: Anotasi Hibernasi .
sumber
Jawaban ini datang agak terlambat, tetapi melengkapi respons.
Untuk menghindari bidang dari entitas yang akan bertahan dalam DB seseorang dapat menggunakan salah satu dari dua mekanisme:
@Transient - anotasi JPA menandai bidang sebagai tidak dapat bertahan
kata kunci sementara di java. Hati-hati - menggunakan kata kunci ini, akan mencegah bidang untuk digunakan dengan mekanisme serialisasi apa pun dari java. Jadi, jika bidang harus serial, Anda sebaiknya menggunakananotasi @Transient saja .
sumber
Ada beberapa solusi tergantung pada tipe atribut entitas.
Atribut dasar
Pertimbangkan Anda memiliki
account
tabel berikut :The
account
tabel dipetakan keAccount
entitas seperti ini:Atribut entitas dasar dipetakan ke kolom tabel, sehingga sifat suka
id
,iban
,cents
adalah atribut dasar.Tapi
dollars
,interestCents
, daninterestDollars
yang sifat dihitung, sehingga Anda menjelaskannya dengan@Transient
mengecualikan mereka dari SELECT, INSERT, UPDATE, dan pernyataan SQL DELETE.Asosiasi
Dengan asumsi Anda memiliki yang berikut
post
danpost_comment
tabel:Anda ingin memetakan
lastestComment
asosiasi diPost
entitas ke yang terbaruPostComment
entitas yang ditambahkan.Untuk melakukannya, Anda dapat menggunakan
@JoinFormula
anotasi:Saat mengambil
Post
entitas, Anda dapat melihat bahwalatestComment
itu diambil, tetapi jika Anda ingin memodifikasinya, perubahan akan diabaikan.@MapsId
Cara lain untuk mengabaikan asosiasi yang sudah dipetakan oleh pengenal entitas adalah menggunakan
@MapsId
.Misalnya, pertimbangkan hubungan tabel satu-ke-satu berikut:
The
PostDetails
entitas dipetakan seperti ini:Perhatikan bahwa
id
atribut danpost
asosiasi memetakan kolom basis data yang sama, yaitupost_details
kolom Kunci Utama.Untuk mengecualikan
id
atribut,@MapsId
anotasi akan memberi tahu Hibernate bahwapost
asosiasi menangani tabel nilai kolom Primary Key.Menggunakan
insertable = false, updatable = false
Opsi lain adalah menggunakan
insertable = false, updatable = false
asosiasi yang ingin Anda abaikan oleh Hibernate.Misalnya, kita dapat memetakan asosiasi satu-ke-satu sebelumnya seperti ini:
The
insertable
danupdatable
atribut@JoinColumn
penjelasan akan menginstruksikan Hibernate untuk mengabaikanpost
asosiasi sejak entitas identifier menguruspost_id
kolom Primary Key.sumber
post
danpost_details
tabel sebagai contoh?Untuk menyelesaikan jawaban di atas, saya memiliki kasing menggunakan file pemetaan XML di mana tidak ada
@Transient
atautransient
bekerja ... Saya harus memasukkan informasi sementara di file xml:sumber
Tidak ada jawaban di atas yang berfungsi untuk saya menggunakan Hibernate 5.2.10, Jersey 2.25.1 dan Jackson 2.8.9. Saya akhirnya menemukan jawabannya (semacam, mereka referensi hibernate4module tetapi berfungsi untuk 5 juga) di sini . Tak satu pun dari anotasi Json bekerja sama sekali
@Transient
. Rupanya Jackson2 'cukup' cukup baik untuk mengabaikan hal-hal yang ditandai@Transient
kecuali jika Anda secara eksplisit mengatakannya untuk tidak melakukannya. Kuncinya adalah menambahkan modul hibernate5 (yang saya gunakan untuk berurusan dengan anotasi Hibernate lainnya) dan menonaktifkanUSE_TRANSIENT_ANNOTATION
fitur di Aplikasi Jersey saya:Berikut adalah ketergantungan untuk Hibernate5Module:
sumber
@JsonProperty
@JsonInclude
@JsonSerialize + @JsonDeserialize
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));
, solusi ini akhirnya berhasil. Terima kasih!Terkadang Anda ingin:
Menggunakan
@Column(name = "columnName", insertable = false, updatable = false)
Skenario yang baik adalah ketika kolom tertentu secara otomatis dihitung dengan menggunakan nilai kolom lainnya
sumber