JPA kalıcılığı arasındaki @Basic(optional = false)ve @Column(nullable = false)içindeki fark nedir ?
JPA kalıcılığı arasındaki @Basic(optional = false)ve @Column(nullable = false)içindeki fark nedir ?
Yanıtlar:
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
optionalvenullabledeğ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.
@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.
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?
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.)
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 ..