Mi web framework (Play 1.2.5) crea una EJB3Configuration local para un método que usa para crear un EntityManagerFactory
(source). Estoy trabajando en un script y me gustaría ejecutar el método generateSchemaUpdateScript()
desde Configuración para hacer scripts SQL que pueda verificar y ejecutar en implementaciones de producción. El problema que estoy teniendo es que no puedo entender cómo acceder al objeto de configuración que se usó o cómo generar un objeto de configuración después de que se haya construido el EntityManagerFactory
.¿Cómo obtengo la configuración de Hibernate después de que se haya construido EntityManagerFactory?
¿Cómo obtengo la configuración de Hibernate después de que se haya construido EntityManagerFactory?
Respuesta
No se puede obtener el objeto de configuración de vuelta de la EntityManagerFactory porque la implementación de hibernación EntityManagerFactoryImpl no mantiene una referencia al objeto de configuración
opciones son
- duplica el código de JPAPlugin en el script para crear su propio objeto de configuración
- configure las herramientas de hibernación para trabajar en sus clases. Nunca he usado esta herramienta a mí mismo, pero supongo que correctamente configurado que puede generar el DDL para que
- genera volver la secuencia de comandos DDL a partir de su base de datos
Una vez se ha creado la fábrica Gestor de entidades que no se supone que tienen el identificador del objeto Configuración, en parte debido al diseño en el que se supone que la Configuración debe mostrar un comportamiento inmutable, ya que no puede cambiar sus propiedades.
Me refiero a Hibernate 3.6.8 origen y la clase EJB3Configuration tiene método
public AnnotationConfiguration getHibernateConfiguration() {
//TODO make it really read only (maybe through proxying)
return cfg;
}
AnnotationConfiguration se declara como obsoleta, ya que toda su funcionalidad se mueve a la clase de configuración.
Así que creo que al usar esto puede obtener el control de su configuración una vez que se ha creado. Tienes que tener mucho cuidado, aunque no cambiar nada en esa configuración.
Esto se explica en los javadocs here
Después #buildEntityManagerFactory() ha sido llamado, ya no se puede cambiar el estado de configuración (sin la adición de la clase, sin cambio de propiedad etc)
Habiendo dicho eso, lo que está tratando de lograr es algo que es ESTRICTAMENTE NO ASISTIDO especialmente en la base de datos de producción. Ver here
Hibernate tiene una propiedad llamada "hibernate.hbm2ddl.auto" que sirve para ayudar a la generación automática de esquemas en caso de que se desarrollen scripts. Lo que está intentando lograr programáticamente tiene mismo efecto que le da un valor de actualización como abajo en su persistencia xml. De hecho, bajo las cubiertas, la configuración llama al método generateSchemaUpdateScript cuando se tiene el valor de "hibernate.hbm2ddl".Auto" en 'actualizar'
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="xyz" transaction-type="RESOURCE_LOCAL">
<properties>
....................
<property name="hibernate.hbm2ddl.auto" value="update"/>
......................
</properties>
</persistence-unit>
</persistence>
Se puede hacer referencia a otros posibles valores para este atributo here
Sin embargo la documentación de Hibernate asesora stricltly contra el uso de esto en contra de la base de datos de producción.
El libro definitivo sobre hibernar "persistencia de Java con Hibernate", advierte este
ADVERTENCIA Hemos visto Hola Los usuarios de bernate que intentan usar SchemaUpdate en actualizan automáticamente el esquema de una base de datos de producción. Esto puede terminar rápidamente en un desastre y no será permitido por su DBA.
y también algunas limitaciones sobre el proceso de actualización del esquema de
Una opción adicional para esta propiedad de configuración, actualización, puede ser útil durante el desarrollo: Permite a la herramienta SchemaUpdate incorporado, que puede hacer que la evolución del esquema sea más fácil. Si está habilitado, Hibernate lee los metadatos de la base de datos JDBC en el inicio y crea nuevas tablas y restricciones comparando el esquema anterior con los metadatos de asignación actuales . Tenga en cuenta que esta funcionalidad depende de la calidad de los metadatos proporcionados por el controlador JDBC, un área en la que faltan muchos controladores . En la práctica, esta característica es, por lo tanto, menos emocionante y útil de lo que parece.
ACTUALIZACIÓN 1: Si usted no tiene acceso a EJB3Configuration y su objetivo final es crear los scripts de actualización de esquema para entidades JPA anotada a continuación, puede crear mediante programación la EJB3Configuration en una clase principal de Java usando una persistencia archivo xml que contiene los detalles de configuración de su base de datos y ejecuta la herramienta de exportación de esquemas. Vea el ejemplo this cómo puede hacerlo. De esta forma, podría ejecutar la herramienta en entidades JPA fuera de su marco o incluso contenedor.
ACTUALIZACIÓN 2
El código de ejemplo aparece here muestra cómo se puede utilizar la actualización del esquema de hibernación cuando se crean las migraciones de bases de datos para aplicaciones de juego. Parece que esto es lo que querías!
Por razones fuera de mi control, no tengo acceso a la instancia de EJB3Configuration, por lo que no puedo tomar la configuración de eso. Estoy de acuerdo con su consejo adicional, mi plan actual era ejecutar generateSchemaUpdateScript() contra mi base de datos de desarrollo y verificar la actualización de sql y dejar que mi DBA ejecute eso después de verificarlo. –
¡Vea mis actualizaciones arriba si ayuda! – Shailendra
He agregado un enlace en la sección "ACTUALIZAR 2" que parece que hace lo que quiere hacer. – Shailendra
- 1. Agregar servicios después de que se haya construido el contenedor
- 2. cómo establecer postData en jqgrid DESPUÉS de que se haya construido?
- 3. Spring + EntityManagerFactory + Hibernate Listeners + Injection
- 4. ¿Cómo obtengo la carga de Hibernate import.sql?
- 5. ¿Cómo puedo permitir que mi CountDownTimer se restablezca después de que la cuenta regresiva haya finalizado?
- 6. CSS surte efecto después de que la página haya procesado
- 7. Extraño "La colección se modificó después de que se haya creado la instancia del enumerador" excepción
- 8. ¿XPathDocument usa la secuencia de memoria en la que está construido después de la construcción?
- 9. Cómo obtener la URL original después de que se haya llamado a HttpContext.RewritePath()
- 10. tema dialecto de Hibernate con la configuración de la primavera
- 11. ¿Cuándo deberíamos cerrar EntityManagerFactory?
- 12. Llamada de Android de nuevo después de que la representación del diseño se haya completado?
- 13. ¿Cómo ejecuto algún código en una superclase después de que se hayan construido todas las subclases?
- 14. Django: ¿cómo agregar un formulario adicional a un formset después de que se ha construido?
- 15. ¿Cómo establecer el color de fondo de la ventana después de que la haya registrado?
- 16. ¿Se está ejecutando el código después de que Rails se haya cargado?
- 17. ¿Cómo cambio el tamaño de un Google Map con JavaScript después de que se haya cargado?
- 18. ¿Cómo puedo actualizar el aspecto de un JFreeChart después de que se haya hecho visible?
- 19. Evento de incendio después de que MarkerClusterer haya terminado
- 20. ejecutar el código DESPUÉS de que Recaptcha.reload() haya finalizado
- 21. Cómo cerrar automáticamente NERDTree después de que se haya abierto un archivo?
- 22. ¿Cómo detener el seguimiento del enlace hasta después de que se haya completado jQuery .animate?
- 23. ¿Cómo puedo desactivar javascript temporalmente después de que una página se haya cargado?
- 24. Hacer algo DESPUÉS de que la página se haya cargado por completo
- 25. Confirmar cambios locales después de que se haya reiniciado la sucursal
- 26. ¿Cómo ejecuto el código DESPUÉS de que se haya cargado un formulario?
- 27. Salir de una pantalla después de que se haya terminado una secuencia de comandos
- 28. Después de cambiar una preferencia (una configuración), el texto que muestra la configuración no se actualiza
- 29. Recarga dinámicamente UIPageViewController después de que dataSource haya cambiado
- 30. ¿Cómo puedo detectar que se haya presionado la tecla Shift?
Sugeriría hablar con el DBA sobre cualquier herramienta de esquema disponible. Es posible que puedan copiar el esquema por usted o proporcionar la secuencia de comandos. – MarkOfHall