【问题标题】:Hibernate non-negative value constraintHibernate 非负值约束
【发布时间】: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 只能是非负数?

【问题讨论】:

    标签: java database hibernate check-constraints


    【解决方案1】:

    如果你需要一个实际的数据库约束,并且你的 schema 是由 Hibernate 生成的,你可以使用@Check 注解:

    @Entity
    @Table(uniqueConstraints = { @UniqueConstraint(columnNames = "code")},
            name = "coupons")
    @Check(constraints = "available_count >= 0")
    public class Coupon implements  Serializable { ... }
    

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案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 - 我不知道 - 这似乎是一个更好的解决方案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-16
          • 2021-04-26
          • 1970-01-01
          • 2016-09-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多