2011-01-18 2 views
4

У меня есть таблица, фрагмент ниже.Ограничение отрицательного значения Hibernate

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 быть только неотрицательным?

ответ

0

Самым простым способом будет сделать это следующим образом:

public void setAvailableCount(Integer availableCount) { 
    if(availableCount < 0){ 
     throw new IllegalArgumentExcpetion("Must be possive value"); 
    } 
    this.availableCount = availableCount; 
} 

Это не будет создавать Databse ограничения.

редактировать:

Если вы использовать JPA-аннотаций, вы можете создать @ PrePerist-Аннотированный метод:

@PrePersist 
public void something(){ 
    if(availableCount < 0){ 
     throw new IllegalArgumentExcpetion("Must be possive value"); 
    } 
} 

коммита, должны потерпеть неудачу, нагрузка должна работать.

+0

:) Я делаю сейчас именно так, но для меня это кажется уродливым - я ищу что-то спящий родной, например как в SQL у нас есть CONSTRAINT – sergtk

+0

У меня были проблемы с обеспечением ограничений в сеттерах в Hibernate. Если вы попытаетесь загрузить объект из базы данных, а 'availableCount' имеет отрицательное значение (в идеале, очевидно, что этого не произойдет ... но закон Мерфи будет вмешиваться, по крайней мере, в моем случае он это делает), то когда Hibernate загружает объект из БД он вызовет этот метод, будет выбрано исключение, и загрузка объекта не удастся. Это также не дает вам возможности исправить недопустимые данные, кроме перехода непосредственно в базу данных без использования Hibernate. –

+0

Это кажется уродливым. На самом деле я не знаю, как это сделать. –

5

Если вам необходимо фактическое ограничение базы данных, и ваша схема генерируется Hibernate, вы можете использовать @Check аннотацию:

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

Вы можете использовать @Min.

public class Coupon implements Serializable { 

    @Min(0) 
    @Column(name = "available_count") 
    private Integer availableCount = 1; 

} 

Минимальная документация: Значение поля или свойства должно быть целым числом больше или равно числу в элементе значения

Проверьте все JPA constaints here

Они действительный для использования в Hibernate

Смежные вопросы