2012-10-04 18 views
14

Estoy trabajando en un producto que admitirá múltiples motores de bases de datos (Oracle, MSSQL, MySQL). Para Oracle, preferiría utilizar Secuencias en lugar de una tabla de Secuencia para evitar posibles problemas de simultaneidad 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 alguna manera de elegir dinámicamente la estrategia en tiempo de ejecución?¿Hay alguna manera de elegir dinámicamente una estrategia @GeneratedValue utilizando anotaciones JPA e Hibernate?

Respuesta

22

En realidad, Hibernate interpreta GenerationType.AUTO y GenerationType.SEQUENCE usando su org.hibernate.id.enhanced.SequenceStyleGenerator. SequenceStyleGenerator es una estrategia de generación de id que elige una de dos estrategias según 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 utilizar una "tabla de secuencia". Este "mapeo" de qué generador usar está controlado por una configuración: hibernate.id.new_generator_mappings. Establecer eso en verdadero habilita el comportamiento que acabo de describir arriba. Lamentablemente, por razones de compatibilidad con versiones anteriores, tuvimos que establecerlo en falso. Para aprovechar eso, 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 proporciona ningún nombre. Esto es controlado por un ajuste llamado 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

+0

¿cómo se puede configurar, todavía tengo que encontrar un ejemplo de cómo cambiar el tamaño_incremento de SequenceStyleGenerator? los parámetros pasados ​​para configurar el método son un conjunto limitado de propiedades establecidas en cfg.xml. optimizer y increment_size no se pasan al mejor de mis esfuerzos. –

+2

'@SequenceGenerator (..., allocationSize = blah)' –

+0

Gracias por la sugerencia. Pero parece un atajo, ya que SequenceGenerator no tiene las mismas propiedades de configuración mencionadas en SequenceStyleGenerator. Intenté esto y funcionó con Pooled Optimizer y me dio la ventaja de rendimiento que estaba esperando. Pero por el bien del cierre. ¿Hay alguna manera de hacerlo en el archivo cfg.xml? El "optimizador" y "increment_size" en el SequenceStyleGenerator.java no fueron leídos por hibernación cuando lo estaba depurando. http://stackoverflow.com/questions/19694154/hibernate-cfg-xml-configuration-for-sequence-generator –

Cuestiones relacionadas