2015-09-05 78 views
1

我在我的@Entity class UpcomingOffer有這樣的:Hibernate爲什麼不抱怨'null'值必須是@NotNull?

@Entity 
public class UpcomingOffer { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="ID") 
    private Long id; 

    @NotNull // Must not be null! 
    @OneToOne 
    private Store store; 

    // ... 
} 

,但由於某種原因,我能救一個StoreOffer而無需Store集:

UpcomingOffer upcomingOffer = new UpcomingOffer(); 

    DateTime date = new DateTime(upcomingOfferDto.getDate()); 
    upcomingOffer.setDate(date); 
    upcomingOffer.setStore(null); 

保存它不會導致一個例外:

Session session = getSessionFactory().getCurrentSession(); 
session.saveOrUpdate(upcomingOffer); 

這導致即將到來的報價的輸入被更新並且不與相關聯擁有那UpcomingOffer

爲什麼Hibernate在用@NotNull註釋時在這裏拋出異常?


enter image description here

+0

你使用的是什麼版本的Hibernate?由於您直接使用hibernate API,我假設您沒有使用JPA。 – greyfox

+0

@greyfox我正在使用'4.3.0.Final'。 – displayname

+0

這可能不是它,而是你的類路徑上的hibernate-validator? – greyfox

回答

0

嘗試增加休眠,驗證到classpath

如果使用Maven添加到您的POM:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>4.3.0.Final</version> 
</dependency> 

的gradle如果添加此到的build.gradle

'org.hibernate:hibernate-validator:4.3.0.Final' 

如果您沒有使用依賴管理/構建工具,那麼您將不得不手動下載jar並將其放入您的類路徑中

另一個可能的問題,或許與您的@OneToOne應該配對Store實體或UpcomingOffer實體上的@JoinColumn。如果您正在進行bidriectional映射,其中一個映射也應該具有mappedBy屬性。如果你讓Hibernate生成數據庫,它可能不會按照預期生成它。

+0

太棒了!非常感謝。我想我永遠不會想到這一點。我也得到了'使用Maven包含但是使用hibernate-validator現在可以工作的' javax.validation validation-api! – displayname

+0

太棒了,很高興它的工作 – greyfox

+0

我也是.....! :d – displayname

0

@NotNull不是JPA註釋,它是JSR 303/349註釋(Bean驗證)。正如@greyfox所建議的那樣,如果您將hibernate-validator添加到您的類路徑中,那麼hibernate將爲您進行驗證,因爲hibernate-validator是Bean驗證規範的實現。

但我認爲,如果你不想在那裏接受空,然後以適當的方式去將是使用依賴於正確的JPA註釋

@Column(nullable = false) 

注意,以紀念列可空你如何生成數據庫表,那麼你還需要更新你的SQL表或不。如果您讓hibernate爲您生成表格,那麼hibernate會將與註釋字段關聯的列標記爲NOT NULL。

請注意,您可以採取任何一種方式(將驗證保留爲hibernate-validator或僅在數據庫級執行驗證,或同時執行驗證)......但似乎適合在DB級執行約束,因爲允許null對你沒有意義。

編輯#1:

啊,我錯過了事實,這是一個外鍵字段。所以是的,使用@OneToOne註解作爲@ greyfox也建議可以做到這一點。

相關問題