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.