Existe-t-il un moyen de choisir de manière dynamic une stratégie @GeneratedValue à l’aide d’annotations JPA et d’Hibernate?

Je travaille sur un produit qui supportera plusieurs moteurs de firebase database (Oracle, MSSQL, MySQL). Pour Oracle, je préférerais utiliser des séquences plutôt qu’une table de séquence pour éviter les problèmes de simultanéité et de locking sur une installation à grand volume, mais les autres moteurs de firebase database ne prennent pas en charge les séquences. De plus, je préférerais utiliser une séquence par table plutôt qu’une séquence globale (telle que hibernate_sequence ). @GeneratedValue(strategy = GenerationType.AUTO) ne fonctionnera donc pas. Existe-t-il un moyen de choisir dynamicment la stratégie à l’exécution?

En fait, Hibernate interprète GenerationType.AUTO et GenerationType.SEQUENCE utilisant son org.hibernate.id.enhanced.SequenceStyleGenerator . SequenceStyleGenerator est une stratégie de génération d’identifiant qui choisit l’une des deux stratégies en fonction de la prise en charge de la firebase database sous-jacente. Si la firebase database prend en charge les séquences, SequenceStyleGenerator utilise des séquences; Si ce n’est pas le cas, SequenceStyleGenerator utilise une “table de séquence”. Ce “mapping” de quel générateur utiliser est contrôlé par un paramètre: hibernate.id.new_generator_mappings . Définir cela sur true permet le comportement que je viens de décrire. Malheureusement, pour des raisons de rétrocompatibilité, nous avons dû le définir par défaut sur false. Pour en profiter, vous devez vous assurer que ce paramètre est défini sur true.

De plus, vous pouvez configurer SequenceStyleGenerator pour qu’il préfère une séquence globale ou une séquence par entité si aucun nom n’est donné. Ceci est contrôlé par un paramètre nommé prefer_sequence_per_entity

SequenceStyleGenerator est assez configurable en général. Consultez ses javadocs pour plus d’informations: http://docs.jboss.org/hibernate/orm/4.1/javadocs/index.html?org/hibernate/id/enhanced/SequenceStyleGenerator.html