Spécification d’une séquence distincte par table dans Hibernate sur les sous-classes

Est-il possible de spécifier des séquences distinctes pour chaque table dans Hibernate, si l’ID est défini sur une superclasse mappée?

Toutes les entités de notre application étendent une super-classe appelée DataObject comme ceci:

 @MappedSuperclass public abstract class DataObject implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "id") private int id; } @Entity @Table(name = "entity_a") public class EntityA extends DataObject { ... } @Entity @Table(name = "entity_b") public class EntityB extends DataObject { ... } 

Cela fait en sorte que toutes les entités utilisent une séquence partagée, la valeur par défaut hibernate_sequence .

Ce que je voudrais faire, c’est utiliser une séquence distincte pour chaque entité, par exemple entity_a_sequence et entity_b_sequence dans l’exemple ci-dessus. Si l’ID était spécifié sur les sous-classes, je pourrais utiliser l’annotation @SequenceGenerator pour spécifier une séquence pour chaque entité, mais dans ce cas l’ID se trouve sur la superclasse. Étant donné que l’identifiant se trouve dans la superclasse, existe-t-il un moyen d’utiliser une séquence distincte pour chaque entité – et si oui, comment?

(Nous utilisons PostgreSQL 8.3, si cela est pertinent)

Avez-vous essayé de le faire de cette façon?

 @MappedSuperclass public abstract class DataObject implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen") @Column(name = "id") private int id; } @Entity @SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entityaseq") @Table(name = "entity_a") public class EntityA extends DataObject { } @Entity @SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entitybseq") @Table(name = "entity_b") public class EntityB extends DataObject { } 

Je suis désolé de ne pas avoir l’environnement requirejs pour le tester pour l’instant, mais je l’essayerai plus tard.

Nous l’utilisons dans la superclasse abstraite de toutes nos entités JPA:

 @Id @GeneratedValue(generator = "pooled") @GenericGenerator(name = "pooled", strategy = "org.hibernate.id.enhanced.TableGenerator", parameters = { @org.hibernate.annotations.Parameter(name = "value_column_name", value = "sequence_next_hi_value"), @org.hibernate.annotations.Parameter(name = "prefer_entity_table_as_segment_value", value = "true"), @org.hibernate.annotations.Parameter(name = "optimizer", value = "pooled-lo"), @org.hibernate.annotations.Parameter(name = "increment_size", value = "100")}) private Long id; 

C’est un peu verbeux, mais cela permet de définir la prefer_entity_table_as_segment_value ce qui signifie que vous n’avez pas besoin de répéter le champ id ou les annotations du générateur dans les sous-classes.

Stretergy de génération de TABLE utilise une séquence de firebase database distincte pour chaque table, mais l’opération est peu coûteuse

IHMO, il existe un meilleur moyen de le faire:

 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; 

Cela fonctionne dans mon application.