@Basic (isteğe bağlı = false) vs @Column (nullable = false) JPA


Yanıtlar:


99

Gordon Yorke (EclipseLink Mimari Komite Üyesi, TopLink Çekirdek Teknik Lideri, JPA 2.0 Uzman Grubu Üyesi) bu konu hakkında iyi bir cevap yazdı, bu yüzden onu başka kelimelerle ifade etmek yerine , cevabını alıntılayacağım :

Arasındaki fark optionalve nullabledeğerlendirildikleri de kapsamıdır. ' optional' Tanımı, özellik ve alan değerlerinden bahseder ve bu özelliğin çalışma süresi içinde değerlendirilmesi gerektiğini önerir. ' nullable' yalnızca veritabanı sütunlarına atıfta bulunur.

Bir uygulama uygulamayı seçerse, optionalbu özellikler Kalıcılık Sağlayıcısı tarafından bellekte değerlendirilmeli ve SQL veritabanına gönderilmeden önce ortaya çıkan bir istisna, aksi takdirde ' updatable=false' ' optional' kullanılırken ihlaller asla rapor edilmeyecektir.


8
Peki hangisi gerçekten kullanılmalı, belki ikisi birden?
Xiè Jìléi

39
@Xie Jilei: Kitaptan: Java kalıcılığı, hazırda bekletme 2007, s. 179: @Basic(optional = false) @Column(nullable = false)@Basic ek açıklaması, özelliği Java nesnesi düzeyinde isteğe bağlı değil olarak işaretliyor. İkinci ayar, sütun eşlemesinde nullable = false, yalnızca NOT NULL veritabanı kısıtlamasının oluşturulmasından sorumludur. Hazırda Bekletme JPA uygulaması, her durumda her iki seçeneği de aynı şekilde ele alır, bu nedenle bu amaçla ek açıklamalardan yalnızca birini de kullanabilirsiniz.
rapt

2
@rapt - Bu The @Basic annotation marks the property as not optional on the Java object level.ne anlama geliyor anlamıyorum ? Öyleyse, sadece söz konusu değişken için @Basicveritabanı sütununu yapmak demek gibi NOT NULLmi?
Erran Morad

9
Bu, boş alana sahip bir varlığı sürdürmeye çalışırsanız, isteğe bağlı = false olarak işaretlenirse (veritabanına başvurmadan) bir istisna atar ve varlık JPA kalıcılık bağlamına eklenmez demektir. Yalnızca nullable = false olarak ek açıklama yapılmışsa, varlık kalıcılık bağlamına eklenir ve varlığı veritabanına yazmaya çalışırken (örneğin, floş aracılığıyla), varlığı bunu reddedecek veritabanına yazmaya çalışır ve o zaman bir istisna yaratacaktır.
Ray Hulha

@RayHulha "@Basic (isteğe bağlı = false)" ile bir alana açıklama eklemeye çalıştım ve veritabanına bir demet ekledim (bu alanın değeri = null), istisna oluşmadı !!, umarım açıklarsınız bana bu davranış.
ziMtyth

4

Bu yüzden, JPA 2.1 (EclipseLink) kullanarak @Basic (isteğe bağlı = false) ek açıklamasını denedim ve açıklamanın gerçek kullanımda (en azından bir String alanı için) göz ardı edildiği ortaya çıktı. (örneğin, entityManager.persist çağrıları).

Bu yüzden şartnameye gittim ve hakkında bir şeyler okudum. Spesifikasyonun söylediği şey:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/

Temel (isteğe bağlı): Alanın veya özelliğin değerinin boş olup olmayacağı. Bu bir ipucudur ve ilkel tipler için dikkate alınmaz; şema oluşturmada kullanılabilir.

Bu yüzden, bu cümlenin şema oluşturmada kullanılan Basic (isteğe bağlı) için gerçek kullanım durumunu açıkladığını düşünüyorum. (Yani: Java Entity sınıflarından CREATE TABLE SQL oluşturduğunuzda. Bu, örneğin Hibernate'in yapabileceği bir şeydir.)


1
Diğer cevabın şema üretimi için kullanılan Temel değil, boş değer atanabilir olduğunu ima etmesi komiktir ("nullable" sadece veritabanı sütunlarına atıfta bulunur "dediğinde). Hala çok kafa karıştırıcı. Ben null tahmin edilmektedir şema üretimi ve Basic (opsiyonel = false) için kullanılan olabilir aynı amaçla kullanılabilir? bu mantıklı mı?
marcus

optional = falseyalnızca bu kısıtlamayı çalışma zamanında kontrol etmek içindir. nullable = falseveritabanı kısıtlaması oluşturur. Uygulamalar için, ayarlamak optional = falseda mantıklıdır, çünkü veritabanına gitmekten daha hızlı değerlendirilir ve orada kısıtlama kontrol edilir ..
nimo23
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.