2009-08-24 6 views
1

Je crée un enregistrement de Widgets avec Hibernate. C'est assez basique. J'ai un fichier hbm.xml décrivant l'objet, une classe DAO qui les crée et les enregistre, etc.Insertion d'une valeur générée dans un enregistrement Hibernate

Cependant, il y a un ordre de tri explicite pour les widgets, et chaque nouveau widget doit être inséré avec un sortIndex Valeur de colonne supérieure à toutes les autres valeurs de colonne sortIndex (les nouveaux widgets sont automatiquement triés en dernier). Je ne peux pas pour la vie de moi comprendre comment accomplir ceci. Hibernate est parfaitement capable de paramétrer automatiquement les colonnes ID, et il me semble logique de pouvoir définir une autre colonne à une valeur unique selon une formule comme max (sortIndex) +1 ou selon certaines valeur de générateur de séquence, mais je ne trouve pas de référence dans la documentation à ce genre de chose. Quelqu'un peut-il m'indiquer la bonne direction? Une approche qui a germé à l'esprit était de faire une requête manuelle pour le plus haut sortIndex, mais j'ai commencé à m'inquiéter de deux transactions différentes trouvant à la fois le même sortIndex.

Répondre

1

Je déteste le dire, mais je pense qu'il vaut mieux le faire simplement par programmation. Juste quelque chose dans les lignes de:

public void saveNewWidget(Widget widget) { 
    Session session = ...; 
    int sortIndex = ((Integer) session.createQuery("select max(w.sortIndex) from Widget w").uniqueResult()) + 1; 
    widget.setSortIndex(sortIndex); 
    session.save(widget); 
} 

(Note: Je ne thread-safe ne vois pas une bonne façon de le rendre sûr, sauf en bloquant toute la table je blâme la fatigue...)

La raison en est qu'il ne semble ni UserType ni un Interceptor personnalisé peut vous aider ici. Donc, si vous vraiment voulez le faire vous-même, vous devrez peut-être écrire votre propre ClassPersister. Et c'est le chemin de la folie.

Questions connexes