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:无法添加或更新子行:外键约束失败

如何使用 Hibernate 注释标记外键约束?

在 Hibernate 中使用 SEQUENCE 时导致唯一约束违规的原因是啥?

hibernate如何生成外键约束名?

如何使用 Hibernate 注释创建允许 NULL 值的唯一约束?

为啥 Hibernate 允许我在外键约束上插入空值?