Hay una manera de especificar secuencias distintas para cada tabla en modo de Hibernación, si el IDENTIFICADOR está definido en el mapeo de una superclase?

Todas las entidades de nuestra aplicación extender una superclase llamada DataObject como este:

@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 para el uso de una secuencia compartida, el valor predeterminado hibernate_sequence.

Lo que me gustaría hacer es utilizar una secuencia independiente para cada entidad, por ejemplo entity_a_sequence y entity_b_sequence en el ejemplo anterior. Si el IDENTIFICADOR se especifica en las subclases, a continuación, podría utilizar la @SequenceGenerator anotación para especificar una secuencia para cada entidad, pero en este caso el ID es en la superclase. Dado que la IDENTIFICACIÓN es en la superclase, hay una manera que puedo utilizar una secuencia independiente para cada entidad y, si es así, ¿cómo?

(Estamos usando PostgreSQL 8.3, en caso de que proceda)

OriginalEl autor gutch | 2010-12-30

4 Comentarios

  1. 34

    Has probado a 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 {
    
    }

    Estoy lo siento, no tenemos el entorno necesario para probarlo ahora mismo, pero voy a intentarlo más tarde.

    Sí — que hace el trabajo! Yo había intentado algo similar, pero seguía recibiendo un org.hibernate.AnnotationException: Unknown Id.generator: idgen. Sin embargo el código funcionó bien; resulta que se me olvidó incluir el @SequenceGenerator en una de las subclases en mi primer intento. Así que la respuesta es que sí funciona, siempre y cuando cada una de las entidades subclase tiene la @SequenceGenerator anotación.
    Finalmente, una respuesta que funciona. Este fue desconcertante para mí días. Sin embargo, una tabla hibernate_sequence todavía se crea, debo ignorarlo o hay alguna manera de desactivarlo?
    Esto funciona en las versiones < 5.2.14 y >= 5.2.17. consulte hibernate.atlassian.net/browse/HHH-12329, en.relación.a/2018/04/26/hibernate-orm-5217-final-release

    OriginalEl autor François Cassin

  2. 4

    Utilizamos esta en el resumen de la superclase 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 el prefer_entity_table_as_segment_value que significa que usted no tendrá que repetir la id campo o el generador de anotaciones en las subclases.

    OriginalEl autor Frans

  3. 1

    De generación de tablas de stretergy utiliza de base de datos independiente de la secuencia para cada tabla, pero es poco costosa operación

    OriginalEl autor feel good and programming

  4. 1

    IHMO hay mejor manera de hacer esto:

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

    Funciona en mi aplicación.

    Que utiliza la base de datos nativa del método para la generación de Identificadores (por ejemplo, auto_increment en MySQL) y es muy ineficiente para inserciones masivas como la inserta a continuación, debe ser hecho uno por uno para obtener el Id generados a partir de la base de datos del controlador.

    OriginalEl autor Gumovvy Steven

Dejar respuesta

Please enter your comment!
Please enter your name here