Gérer une séquence de base de données avec Spring
Fabian Piau | dimanche 22 septembre 2013 - 19:36Remarque
Il vaut mieux laisser Hibernate gérer tout seul les identifiants techniques (clés primaires). Par contre, il peut arriver que vous ayez besoin de générer un identifiant fonctionnel et qu’un générateur Hibernate ne réponde pas à vos besoins. Dans mon cas, l’identifiant fonctionnel n’était pas tout le temps généré, il pouvait aussi être setté à la main. Malheureusement, au moment d’insérer l’élément en base de données (sauf erreur, mais je n’ai pas trouvé…), le générateur écrase toujours la valeur de mon identifiant fonctionnel même si je l’ai settée manuellement auparavant.
Il vaut mieux laisser Hibernate gérer tout seul les identifiants techniques (clés primaires). Par contre, il peut arriver que vous ayez besoin de générer un identifiant fonctionnel et qu’un générateur Hibernate ne réponde pas à vos besoins. Dans mon cas, l’identifiant fonctionnel n’était pas tout le temps généré, il pouvait aussi être setté à la main. Malheureusement, au moment d’insérer l’élément en base de données (sauf erreur, mais je n’ai pas trouvé…), le générateur écrase toujours la valeur de mon identifiant fonctionnel même si je l’ai settée manuellement auparavant.
Un petit mémo (très technique) utile si vous avez Spring sur votre projet.
C’est dans le cas assez spécifique où l’on souhaite récupérer / incrémenter la valeur d’une séquence et que le Sequence Generator d’Hibernate ne répond pas à vos besoins (voir la remarque).
Plutôt que de passer par une DAO avec du code Hibernate (ou pire JDBC), Spring peut le faire pour vous en 2 minutes…
- Pour cela, il suffit de déclarer un nouveau bean dans la configuration Spring de votre projet:
<bean id='mySequenceIncrementer' class='org.springframework.jdbc.support.incrementer.H2SequenceMaxValueIncrementer'> <property name='dataSource' ref='<Nom de votre datasource>' /> <property name='incrementerName' value='<Nom de votre sequence>' /> </bean>
A noter: il existe plusieurs implémentations d’incrémenteur pour différentes bases de données (j’utilise H2DB, mais MySQL, PostgreSQL, Oracle, etc. sont également disponibles)
- Injecter ce bean dans la classe de votre choix.
- Et désormais, vous pouvez faire:
final Long newIdSequence = mySequenceIncrementer.nextLongValue();
Testé et approuvé!
Commentaires récents