2015-10-05 220 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