java - llaves - llave primaria compuesta hibernate
¿Hay una manera de elegir dinámicamente una estrategia @GeneratedValue usando anotaciones JPA e Hibernate? (1)
Estoy trabajando en un producto que será compatible con varios motores de base de datos (Oracle, MSSQL, MySQL). Para Oracle, preferiría usar secuencias en lugar de una tabla de secuencias para evitar posibles problemas de concurrencia y bloqueo en una instalación de gran volumen, pero otros motores de base de datos no admiten secuencias. Además, preferiría usar una secuencia por tabla en lugar de una secuencia global (como hibernate_sequence
), por lo que @GeneratedValue(strategy = GenerationType.AUTO)
no funcionará. ¿Hay una manera de elegir dinámicamente la estrategia en tiempo de ejecución?
En realidad, Hibernate interpreta tanto GenerationType.AUTO
como GenerationType.SEQUENCE
utilizando su org.hibernate.id.enhanced.SequenceStyleGenerator
. SequenceStyleGenerator es una estrategia de generación de id que elige una de las dos estrategias basadas en lo que admite la base de datos subyacente. Si la base de datos admite secuencias, SequenceStyleGenerator usa secuencias; si no lo hace, SequenceStyleGenerator vuelve a usar una "tabla de secuencia". Este "mapeo" de qué generador usar se controla mediante una configuración: hibernate.id.new_generator_mappings
. Establecer eso en verdadero habilita el comportamiento que acabo de describir. Desafortunadamente, por razones de compatibilidad con versiones anteriores, tuvimos que predeterminar que falso. Por lo tanto, para aprovechar esto, deberá asegurarse de que la configuración esté establecida en verdadero.
Además, puede configurar SequenceStyleGenerator para que prefiera una secuencia global o una secuencia por entidad si no se da un nombre. Esto se controla mediante una configuración llamada prefer_sequence_per_entity
SequenceStyleGenerator es bastante configurable en general. Eche un vistazo a sus javadocs para obtener más información: http://docs.jboss.org/hibernate/orm/4.1/javadocs/index.html?org/hibernate/id/enhanced/SequenceStyleGenerator.html