Tolong jelaskan tentang insertable = false dan updatable = false dalam referensi untuk penjelasan JPA @Column

151

Jika bidang diberi keterangan insertable=false, updatable=false, bukankah itu berarti Anda tidak bisa memasukkan nilai atau mengubah nilai yang ada? Mengapa Anda ingin melakukan itu?

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy="person", cascade=CascadeType.ALL)
    private List<Address> addresses;
}

@Entity
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name="ADDRESS_FK")
    @Column(insertable=false, updatable=false)
    private Person person;
}
Thang Pham
sumber

Jawaban:

121

Anda akan melakukannya ketika tanggung jawab untuk membuat / memperbarui entitas terkait yang bersangkutan tidak ada di entitas saat ini . Misalnya Anda punya Persondan Address. Anda ingin menambahkan insertable=false, updatable=falseke @OneToManyhubungan dengan Personentitas di Addressbadan, hanya karena itu bukan tanggung jawab Addressentitas untuk membuat atau memperbarui Person. Itu sebaliknya.

BalusC
sumber
Ini mengacu pada mendefinisikan insertable=false,updatable=falsesalah satu sisi hubungan.
BalusC
3
Anda mengatakan bahwa dengan updatable = false pada Orang itu akan menonaktifkan pembaruan Person.name ketika memperbarui alamat (saya tidak setuju karena ini adalah tujuan kaskade). Anda juga mengatakan bahwa definisi @Column melakukan sesuatu yang berbeda ketika kunci asing (Orang) dan ketika bukan kunci asing (karena tidak ada entitas yang direferensikan untuk menonaktifkan pembaruan). Dengan membaca javadoc untuk diupdate saya akan mengatakan bahwa itu hanya akan menonaktifkan untuk mengubah Orang yang diberikan Alamat jika itu pernah ada. Bisakah Anda jelaskan?
Flowy
8
Saya pikir Anda bermaksud mengatakan ... to the @ManyToOne relationship with the ...??
Martin Konecny
111

Menentukan insertable=false, updatable=falseberguna ketika Anda perlu memetakan bidang lebih dari satu kali dalam suatu entitas, biasanya:

Ini IMO bukan hal semantik, tapi jelas teknis.

Thivent Pascal
sumber
15
Saya sangat percaya bahwa jawaban ini jauh lebih baik daripada yang diterima. Jawaban yang diterima menyampaikan perasaan bahwa atribut insertable / updatable berkaitan dengan pembuatan / pembaruan entitas terkait, sedangkan maksud sebenarnya di balik atribut ini adalah untuk mencegah penyisipan / pembaruan kolom pada entitas saat ini. Penciptaan / pembaruan entitas terkait ditangani oleh atribut kaskade dari anotasi pemetaan.
Jayant
25

Saya ingin menambahkan jawaban BalusC dan Pascal Thivent penggunaan umum lainnya dari insertable=false, updatable=false:

Pertimbangkan kolom yang bukan id tetapi semacam nomor urut . Tanggung jawab untuk menghitung nomor urut mungkin belum tentu menjadi milik aplikasi.

Misalnya, nomor urut dimulai dengan 1000 dan harus bertambah satu untuk setiap entitas baru. Ini mudah dilakukan, dan sangat tepat, dalam database, dan dalam kasus seperti ini konfigurasi ini masuk akal.

Magnilex
sumber
1
urutan didukung oleh JPA juga, sehingga Anda dapat menentukan urutan Anda dengan anotasi JPA juga.
eis
8

Contoh lain adalah pada kolom "Created_on" di mana Anda ingin membiarkan database menangani pembuatan tanggal

Johny19
sumber
Apakah Hibernate seharusnya memblokir pembaruan berdasarkan pada anatasi yang dapat diperbarui = salah? Dalam pengujian repositori JPA saya, kolom Created_on dengan anotasi ini menerima pembaruan tanpa keluhan.
chrisinmtown
1
@chrisinmtown Eclipselink tidak akan menyertakan kolom dalam sql sama sekali. Saya berharap itu sama dengan Hibernate
Jaqen H'ghar