Persistensi Java / JPA: @Column vs @Basic

119

Apa perbedaan antara anotasi @Columndan @Basicdi JPA? Bisakah mereka digunakan bersama? Haruskah mereka digunakan bersama? Atau apakah salah satunya cukup?

Hosam Aly
sumber

Jawaban:

147
  • @Basicmenandakan bahwa atribut harus dipertahankan dan pemetaan standar akan digunakan. Ini memiliki parameter yang memungkinkan Anda untuk menentukan apakah atribut akan dimuat secara malas dan apakah itu nullable.

  • @Column memungkinkan Anda menentukan nama kolom dalam database tempat atribut tersebut akan dipertahankan.

Jika Anda menentukan satu tanpa yang lain maka Anda mendapatkan perilaku default yang masuk akal, jadi umumnya orang hanya menggunakan satu dengan pengecualian kasus khusus.

Jadi jika kita menginginkan sebuah atribut lazy loading dan untuk menentukan nama kolom kita bisa mengatakannya

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

Jika kita membutuhkan default, perilaku non-malas maka hanya @Columnitu sudah cukup.

djna
sumber
2
Ini jawaban yang jelas. Terima kasih. Jadi saya berasumsi seseorang dapat menggunakan @Basictanpa @Column, itulah sebabnya properti optionaldan nullableada di keduanya. Apakah saya benar?
Hosam Aly
1
Saya tidak mengklaim sepenuhnya memahami spesifikasi JPA tentang perbedaan antara @ Basic nullable dan @ Column's nullable dan efek dari tidak menentukan keduanya, salah satu atau keduanya. @Basic nullable dideskripsikan sebagai "petunjuk" yang relevan dengan pembuatan skema. @Column nullable dijelaskan sebagai mendefinisikan karakteristik kolom dalam database. Praktik saya akan menggunakan kasus @Column.
djna
16
@Basic (opsional) adalah (harus) diperiksa pada waktu proses oleh penyedia persistensi sebelum menyimpan ke DB. @Column adalah definisi kolom dalam database dan digunakan untuk pembuatan skema: stackoverflow.com/questions/2899073/…
Piotr Gwiazda
2
yang 'tidak malas', sebut EAGER. LOL
solvator
7
Anotasi JPA dapat dibagi menjadi dua kelompok: anotasi relasional murni versus anotasi implementasi. Anotasi relasional murni berisi: Entity, Basic, OneToOne, OneToMany, ManyToMany, ... sedangkan anotasi implementasi memberikan petunjuk tentang cara memetakan model teoritis murni ke database nyata: Tabel, Kolom, ... Dalam pertanyaan Anda 'Basic 'adalah anotasi untuk memberikan informasi tentang atribut entitas relasional sedangkan' Kolom 'memberikan informasi tentang cara memetakannya ke kolom database.
Bruno Ranschaert
50

Selain jawaban @ djna , perlu dicatat bahwa @Basicharus dibandingkan dengan @OneToMany, @ManyToOnedan @ManyToMany. Hanya satu dari ini yang dapat ditentukan di properti mana pun.

@Columndan @JoinColumndapat ditentukan bersama dengan ini untuk menjelaskan properti kolom database.

Ini adalah dua kumpulan anotasi yang dapat digunakan bersama, tetapi hanya satu anotasi dari setiap kumpulan yang dapat digunakan dalam satu waktu.

Hosam Aly
sumber
21

Perlu dicatat bahwa Basic dirancang untuk bidang primitif

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

Atribut dasar adalah salah satu di mana kelas atribut adalah tipe sederhana seperti String, Angka, Tanggal atau primitif. Nilai atribut dasar dapat langsung dipetakan ke nilai kolom dalam database.

Jenis dan konversi yang didukung bergantung pada implementasi JPA dan platform database. Atribut dasar apa pun yang menggunakan tipe yang tidak memetakan langsung ke tipe database dapat diserialkan ke tipe database biner.

Cara termudah untuk memetakan atribut dasar di JPA adalah dengan tidak melakukan apa pun. Setiap atribut yang tidak memiliki penjelasan lain dan tidak mereferensikan entitas lain akan secara otomatis dipetakan sebagai dasar, dan bahkan diserialkan jika bukan tipe dasar. Nama kolom untuk atribut akan menggunakan default, dinamai sama dengan nama atribut, sebagai huruf besar.

Mengobrol
sumber
Catatan bagus. Terima kasih.
Hosam Aly
1
Tidak, Jika tidak ada anotasi Kolom yang ditentukan, nilai default akan berlaku (nama akan menjadi atributnya).
Gab
2

Anotasi @Basic diterapkan ke entitas JPA, dan dari @Column diterapkan ke kolom database Atribut opsional anotasi @Basic menentukan apakah kolom entitas bisa kosong atau tidak; di samping itu,

  • Atribut nullable anotasi @Column menentukan apakah kolom database terkait bisa null
  • Kita bisa menggunakan @Basic untuk menunjukkan bahwa bidang harus dimuat secara lambat
  • Anotasi @Column memungkinkan kita menentukan nama kolom database yang dipetakan
  • Anotasi @Basic menandai properti sebagai bukan opsional pada tingkat objek Java. Dan (nullable = false) pada pemetaan kolom, hanya bertanggung jawab untuk menghasilkan kendala database NOT NULL.
Sonu patel
sumber