2015-10-05 222 views
0

我嘗試做以下春天JPA列默認值

@ManyToOne 
@JoinColumn(name="tier_id", columnDefinition = "INT default 1", nullable = false) 
public Tier getTier() { 
    return tier; 
} 

但同時插入記錄我拿到 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'tier_id' cannot be null

我想默認tier_id1如果它沒有設置,但它不是加工。我該如何正確設置?

回答

1

僅當插入語句中列完全不存在時才使用默認SQL值。

但是Hibernate不會在插入語句中省略列。如果你創建一個帶有空層的實體實例並且堅持它,那麼你實際上是在說Hibernate你想用一個空層持久化一個實體,並且Hibernate顯式地將tier_id列設置爲null,因爲這就是你告訴它的內容做。

所以,如果你希望你的實體層是ID爲1級,然後做它明確地在應用程序代碼:

SomeEntity e = new SomeEntity(); 
e.setTier(em.getReference(Tier.class, 1)); 
em.persist(e); 
+0

所以基本上我要取使用TierDao數據庫我想層例如,然後將其設置爲實體,對嗎?我認爲有一種方法可以在不查詢層的情況下進行,就像所有新記錄將從具有ID 1的層開始。也許我錯誤地考慮了它。非常感謝解釋。 – prettyvoid

+0

這就是em.getReference()所做的:它返回一個未初始化的代理,不查詢數據庫。 –

+0

任何想法如何使用彈簧持久性上下文實現相同?我只是將daos作爲實現CrudRepository的接口。我應該以某種方式獲得對EntityManager的引用嗎?任何提示將不勝感激,感謝有價值的信息,仍然在這裏學習:) – prettyvoid