2013-06-19 3 views
0

Je dois créer une table avec exactement une ligne.grails hibernate créer une table avec exactement une ligne

J'ai une classe de domaine, par exemple Book, qui a la propriété Year.

class Book { 

    Integer year 

    static mapping = { 
    ... 
    } 

} 

Que dois-je écrire dans une classe de domaine?

+0

Je ne pense pas que vous déclariez une limite pour le nombre de lignes. Vous pouvez avoir une contrainte unique sur l'année, cela serait-il suffisant? – elias

Répondre

0

Par exemple, si vous avez besoin qu'un seul enregistrement comptable à l'année 2013, vous pouvez définir votre contrainte comme

class Book { 
    Integer year 
    static constraints = { 
    year inList: [2013], unique: true 
    } 
} 

unique: true ne vous laissera pas créer des enregistrements avec double year et inList fera en sorte que vous avez un et seulement un year qui est 2013. Les deux contraintes passeront pour la première insertion et échoueront pour les insertions/mises à jour suivantes. Par conséquent, vous ne disposez que d'un enregistrement dans Book avec l'année 2013.

0

Malheureusement, l'événement GORM que vous utiliseriez pour accomplir cette opération ne permet pas le rejet de l'insertion (à partir du Graal 2.2.2). beforeUpdate fait, mais cela ne vous aide pas dans ce cas.

Il y a deux solutions qui viennent à l'esprit:

  • en utilisant une méthode de service pour effectuer la prise de décision d'insérer ou non. Toutefois, si une autre classe utilise directement la classe de domaine, vous n'avez aucun rejet d'insertion automatique.

  • Créez un Hibernate personnalisé PreInsertEventListener qui vérifie si la table contient déjà des données.

Burt Beckwith en utilisant un Outlined écouteur d'événement Hibernate personnalisé pour créer efficacement en lecture seule des classes de domaine dans son gr8Conf session from 2011 si vous voulez un exemple de ce dernier.

Questions connexes