usadas tablas provienen para paquete mapeo mapear las joined herencia entidades con anotaciones java hibernate postgresql sequence

java - tablas - Especificar una secuencia distinta por tabla en Hibernate en subclases



mapear tablas hibernate eclipse (4)

¿Hay una manera de especificar secuencias distintas para cada tabla en Hibernate, si el ID se define en una superclase asignada?

Todas las entidades en nuestra aplicación extienden una superclase llamada DataObject como esta:

@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 { ... }

Esto hace que todas las entidades utilicen una secuencia compartida, la hibernate_sequence predeterminada.

Lo que me gustaría hacer es usar una secuencia separada para cada entidad, por ejemplo, entity_a_sequence y entity_b_sequence en el ejemplo anterior. Si el ID se especificara en las subclases, entonces podría usar la anotación @SequenceGenerator para especificar una secuencia para cada entidad, pero en este caso el ID está en la superclase. Dado que la identificación está en la superclase, ¿hay alguna manera de que pueda usar una secuencia separada para cada entidad? ¿Y si es así, cómo?

(Estamos usando PostgreSQL 8.3, en caso de que sea relevante)


¿Has intentado hacerlo de esta manera?

@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 { }

Lo siento, no tengo el entorno necesario para probarlo ahora mismo, pero lo intentaré más tarde.


IHMO hay mejor manera de hacer esto:

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

Funciona en mi aplicación.


La generación de TABLE stretchergy utiliza una secuencia de db separada para cada tabla, pero es una operación poco costosa


Usamos esto en la superclase abstracta de todas nuestras entidades 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;

Es un poco detallado, pero permite establecer prefer_entity_table_as_segment_value que significa que no es necesario repetir el campo id o las anotaciones del generador en las subclases.