Karışıklık: JPA ve Hazırda Bekletme ile @NotNull ve @Column (nullable = false)


242
  1. Bir alanda / alıcıda göründüklerinde @Entityaralarındaki fark nedir? (Varlığı Hazırda Bekletme yoluyla devam ettiririm ).

  2. Her biri hangi çerçeveye ve / veya spesifikasyona aittir?

  3. @NotNulliçinde yer almaktadır javax.validation.constraints. Gelen javax.validation.constraints.NotNulljavadoc diyor

    Ek açıklamalı öğe boş olmamalıdır

    ancak öğenin veritabanındaki temsilinden bahsetmez, bu yüzden neden nullable=falsesütuna kısıtlama ekleyeyim ?

Yanıtlar:


328

@NotNullbir JSR 303 Fasulye Doğrulama ek açıklamasıdır. Veritabanı kısıtlamaları ile ilgisi yoktur. Hibernate, JSR 303'ün referans uygulaması olduğundan, akıllıca bu kısıtlamaları alır ve bunları sizin için veritabanı kısıtlamalarına çevirir, böylece bir tanesinin fiyatı için iki tane alırsınız. @Column(nullable = false)bir sütunun null olmadığını bildirmenin JPA yoludur. Yani birincisi doğrulama ve ikincisi veritabanı şeması detaylarını belirtmek içindir. Hazırda bekletme modundan doğrulama ek açıklamaları için ek yardım (ve hoş geldiniz!) Yardımı alıyorsunuz.


2
Teşekkürler! JPA kalıcılığımın Hazırda Bekletme uygulamasına bağlı olmamasını istiyorsam (yani EJB3'e değiştir), o zaman her iki ek açıklamayı da kullanmalıyım (hem alan hem de sütununda null değerini yasaklamak için)?
mest

3
Bilmiyorum. Bir JPA sağlayıcısının JSR 303 ek açıklamalarını tanıması gerektiğini söyleyen hiçbir özellik yoktur, ancak bu diğer sağlayıcıların tanımadığı anlamına gelmez. Herhangi bir işe yarayıp yaramadığını söyleyemem.
Ryan Stewart

7
JPA sağlayıcılarının JSR303 uygulaması sağlaması gerekmez, ancak herhangi bir üçüncü taraf JSR303 uygulamasıyla entegrasyon yeteneği sağlamak için gereken spesifikasyona uygundur. Hibernate JSR303 sağlarken, nedense onlarınkini kullanmamaya karar verebilirsiniz ve başka biriyle birlikte gidebilir veya openJPA gibi bir JPA uygulaması kullanabilir ve JSR303 sağlamak için başka birini kullanabilirsiniz. 'JPA kalıcılığımın Hazırda Bekletme uygulamasına (yani EJB3'e değiştir) bağlı olmamasını istersem' JPA, EJB3 belirtiminin bir parçasıdır.
Shahzeb

5
@Shahzeb: Soru, JSR 303 doğrulamasını kimlerin desteklediğini / sağladığını değil. Bu hangi ORM (ler) gibi JSR 303 ek açıklamaları tanımak var @NotNull, @Size, @Min, @Max, vb ve veritabanı kısıtları dönüştürmelidir.
Ryan Stewart

1
Evet ama yorumum, OP'nin bilmediğiniz sonraki yorumda sorduğu bağlamda geçerlidir.
Shahzeb

18

Derin uyku JPA sağlayıcısı en son versiyonları gibi fasulye doğrulama kısıtlamaları (JSR 303) uygular @NotNullvarsayılan olarak DDL için (sayesinde hibernate.validator.apply_to_ddl propertyiçin varsayılan true). Ancak diğer JPA sağlayıcılarının bunu yapabileceğine ve hatta yapma yeteneğine sahip olduğuna dair bir garanti yoktur.

@NotNullJVM'de java fasulyeleri doğrulanırken, fasulye özelliklerinin boş olmayan bir değere ayarlandığından emin olmak gibi fasulye doğrulama ek açıklamaları kullanmalısınız (bunun veritabanı kısıtlamaları ile ilgisi yoktur, ancak çoğu durumda bunlara karşılık gelmelidir).

Ayrıca @Column(nullable = false), jpa sağlayıcısına, istediğiniz veritabanı kısıtlamalarına sahip tablo sütunları oluşturmak için doğru DDL'yi oluşturmak üzere ipuçları vermek için JPA ek açıklamasını kullanmalısınız . Çekirdek doğrulama kısıtlamalarını varsayılan olarak DDL'ye uygulayan Hazırda Bekleme gibi bir JPA sağlayıcısına güvenebilir veya güvenmek isterseniz, bunları atlayabilirsiniz.


10

İlginçtir ki, tüm kaynaklar @Column (nullable = false) öğesinin yalnızca DDL oluşturma için kullanıldığını vurgular.

Ancak, @NotNull ek açıklaması olmasa ve hibernate.check_nullability seçeneği true değerine ayarlanmış olsa bile, Hazırda Bekletme kalıcı olacak varlıkların doğrulamasını gerçekleştirir.

Nullable = false özniteliklerinin veritabanı katmanında bu tür kısıtlamalar uygulanmasa bile değerleri yoksa, "null olmayan özellik null veya geçici bir değere başvuruyor" diyerek PropertyValueException özelliğini kullanır.

Hibernate.check_nullability seçeneği hakkında daha fazla bilgiyi şu adreste bulabilirsiniz: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping .


7

JPA @ColumnEk Açıklaması

nullableÖznitelik @Columnaçıklama iki amacı vardır:

  • şema oluşturma aracı tarafından kullanılır
  • Hazırda Bekletme tarafından Kalıcılık Bağlamını yıkarken kullanılır

Şema Oluşturma Aracı

HBM2DDL şema oluşturma aracı , deyimi oluştururken @Column(nullable = false)varlık niteliğini NOT NULLilişkili tablo sütunu için bir kısıtlamaya dönüştürür CREATE TABLE.

Hazırda Bekletme Kullanıcı Kılavuzu'nda açıkladığım gibi , veritabanı şemasını oluşturmak için HBM2DDL mekanizmasına güvenmek yerine Flyway gibi bir araç kullanmak daha iyidir .

Kalıcılık Bağlamında Yıkama

Kalıcılık Bağlamını temizlerken, Hazırda Bekletme ORM @Column(nullable = false)öğesi varlık özelliğini de kullanır :

new Nullability( session ).checkNullability( values, persister, true );

Doğrulama başarısız olursa, Hazırda Bekletme öğesi a atar PropertyValueExceptionve INSERT veya UPDATE ifadesinin gereksiz yere yürütülmesini engeller:

if ( !nullability[i] && value == null ) {
    //check basic level one nullablilty
    throw new PropertyValueException(
            "not-null property references a null or transient value",
            persister.getEntityName(),
            persister.getPropertyNames()[i]
        );    
}

Hazırda Bekletme işlevinin nasıl çalıştığı hakkında daha fazla bilgi için bu makaleye göz atın .

Fasulye Doğrulama @NotNullAçıklaması

@NotNullEk açıklama hazırda ORM en popüler JPA uygulamasıdır gibi Bean Doğrulama tarafından tanımlanmıştır ve, en popüler Bean Doğrulama uygulamasıdır hazırda Doğrulayıcı çerçeve.

Hazırda Bekletme Doğrulayıcı'yı Hazırda Bekletme ORM'si ile birlikte kullanırken, Hazırda Bekletme Doğrulayıcısı ConstraintViolation, varlığı doğrularken bir atar .


Neden uçuş yolunun şema oluşturmaktan daha iyi olduğunu söylüyorsunuz?
Andronicus

1
Bu iyi bir gözlem. Cevabı bir referans bağlantısıyla güncelledim.
Vlad Mihalcea

Referans ve harika cevap için teşekkürler!
Andronicus
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.