Hibernate 非负值约束
Posted
技术标签:
【中文标题】Hibernate 非负值约束【英文标题】:Hibernate non-negative value constraint 【发布时间】:2011-01-18 14:25:31 【问题描述】:我有桌子,下面的 sn-p。
package test;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "code"),
name = "coupons")
public class Coupon implements Serializable
private static final long serialVersionUID = 5534534530153298987L;
@Id
@GeneratedValue
@Column(name = "id")
private long id;
@Column(name = "available_count")
private Integer availableCount = 1;
public Integer getAvailableCount()
return availableCount;
public void setAvailableCount(Integer availableCount)
this.availableCount = availableCount;
如何约束availableCount
只能是非负数?
【问题讨论】:
【参考方案1】:如果你需要一个实际的数据库约束,并且你的 schema 是由 Hibernate 生成的,你可以使用@Check
注解:
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "code"),
name = "coupons")
@Check(constraints = "available_count >= 0")
public class Coupon implements Serializable ...
【讨论】:
【参考方案2】:利用Hibernate Validator project
【讨论】:
【参考方案3】:您可以使用 @Min。
public class Coupon implements Serializable
@Min(0)
@Column(name = "available_count")
private Integer availableCount = 1;
Min 文档:字段或属性的值必须是大于或等于 value 元素中的数字的整数值
检查所有 JPA 约束 here
它们在Hibernate中使用是有效的
【讨论】:
【参考方案4】:简单的方法是这样:
public void setAvailableCount(Integer availableCount)
if(availableCount < 0)
throw new IllegalArgumentExcpetion("Must be possive value");
this.availableCount = availableCount;
这不会创建数据库约束。
编辑:
如果你使用 JPA-Annotations,你可以创建一个 @PrePerist-Annotated 方法:
@PrePersist
public void something()
if(availableCount < 0)
throw new IllegalArgumentExcpetion("Must be possive value");
提交应该失败,加载应该工作。
【讨论】:
:) 我现在就是这样做的,但对我来说似乎很难看 - 我正在寻找一些休眠原生的东西,例如就像在 SQL 中一样,我们有 CONSTRAINT 我在 Hibernate 的 setter 中执行约束时遇到了问题。如果你尝试从数据库加载一个对象,而availableCount
有一个负值(理想情况下显然不会发生......但墨菲定律会介入,至少在我的情况下它会介入)那么当 Hibernate 加载一个对象时从数据库中调用这个方法,会抛出异常,对象的加载会失败。除了不使用 Hibernate 直接进入数据库之外,这也使您没有机会更正无效数据。
好像很难看。事实上,我不知道有什么美容方法可以做到这一点。
@Adrian Smith 无论如何,您是如何实施约束的?您能在此处添加参考吗?
我想我写了两个方法,setAvailableCount
,Hibernate 使用,我做了private
(Hibernate 仍然可以使用它,但使用我的代码的人不能),然后创建另一种方法,如updateAvailableCount
,可供使用我的代码的人使用,其中包含if
语句。但我对这个解决方案不是很满意。更新后的答案包括@PrePersist
- 我不知道 - 这似乎是一个更好的解决方案。以上是关于Hibernate 非负值约束的主要内容,如果未能解决你的问题,请参考以下文章
在 Hibernate 中使用 SEQUENCE 时导致唯一约束违规的原因是啥?