2011-01-18 4 views
4

J'ai la table, l'extrait ci-dessous.Hibernate contrainte de valeur non négative

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; 
     } 
    } 

Comment faire la contrainte pour permettre availableCount être que non négatif?

Répondre

0

Le moyen facile serait de faire comme ceci:

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

Cela ne crée pas une contrainte de databse.

modifier:

Si vous prenez l'utilisation de JPA-Annotations, vous pouvez créer une méthode Annotated PrePerist-de @:

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

COMMIT échoue, le chargement devrait fonctionner.

+0

:) Je fais maintenant exactement de cette façon, mais il semble moche pour moi - je cherche quelque chose d'hibernate native, par exemple comme dans SQL, nous avons CONSTRAINT – sergtk

+0

J'ai eu des problèmes à appliquer des contraintes dans les setters dans Hibernate. Si vous essayez de charger un objet de la base de données, et 'availableCount' a une valeur négative (idéalement, cela ne se produira pas ... mais la loi de Murphy interviendra, du moins dans mon cas), puis quand Hibernate chargera un objet à partir de la base de données, il appellera cette méthode, l'exception sera levée et le chargement de l'objet échouera. Cela ne vous donne également aucune chance de corriger les données invalides, à part aller directement à la base de données sans utiliser Hibernate. –

+0

Il semble être moche. En fait, je ne connais pas de moyen de beauté pour le faire. –

5

Si vous avez besoin d'une contrainte de base de données réelle, et votre schéma est généré par Hibernate, vous pouvez utiliser @Check annotation:

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

Vous pouvez utiliser @Min.

public class Coupon implements Serializable { 

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

} 

Min documentation: La valeur du champ ou de la propriété doit être un entier supérieur ou égal au nombre dans l'élément de valeur

Vérifiez tous JPA constaints here

Ils sont valable pour être utilisé dans Hibernate