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
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
- 1. ¿Cómo anulo la estrategia GenerationType usando anotaciones de Hibernate/JPA?
- 2. @GeneratedValue (estrategia = "IDENTIDAD") vs. @GeneratedValue (estrategia = "SECUENCIA")
- 3. Columna múltiple Unir en Hibernate/JPA Anotaciones
- 4. asignar una lista de cadenas con JPA/Hibernate anotaciones
- 5. Hibernate @generatedvalue para HSQLDB
- 6. Migración de Hibernate a JPA sin anotaciones
- 7. ordenando dinámicamente un NamedQuery? Seam/Hibernate/JPA
- 8. Hibernate Enum mapping utilizando anotaciones
- 9. Hibernate utilizando JPA (entidades anotadas) y liquibase
- 10. Bypass GeneratedValue en Hibernate
- 11. Estrategia de validación JPA
- 12. anotaciones JPA en Android
- 13. una clave Hibernate 3 Compuesto con GeneratedValue
- 14. proveedor JPA 2.0 Hibernate
- 15. Confusión entre JPA e Hibernate en cascada
- 16. OpenEJB con Tomcat e Hibernate y JPA
- 17. Unsigned Int en JPA e Hibernate
- 18. ¿Cómo se gestionan las secuencias de JPA e Hibernate?
- 19. Hibernate: ¿diferencia entre anotaciones y anotaciones de commons?
- 20. Hibernate: resumen de cómo funciona @GeneratedValue
- 21. usando Hibernate UUIDGenerator a través de anotaciones
- 22. ¿Hay alguna manera de cargar un archivo JS local dinámicamente?
- 23. ¿Hay alguna manera de crear elementos dinámicamente <rich:tab>?
- 24. HSQLDB e Hibernate/JPA: ¿no persiste en el disco?
- 25. separan entidades JPA de Hibernate específica ajustes
- 26. Herencia en Hibernate ¿Anotaciones?
- 27. Interceptores Hibernate con anotaciones
- 28. ¿Hay alguna manera de emular la herramienta 'whois' utilizando php?
- 29. ¿Hay alguna manera de depurar un subproceso utilizando pydev?
- 30. Cómo resolver la LazyInitializationException al usar JPA e Hibernate
¿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. –
'@SequenceGenerator (..., allocationSize = blah)' –
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 –