2012-09-07 18 views
6

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?

+0

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

Respuesta

7

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
2

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!

+1

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. –

+0

¡Vea mis actualizaciones arriba si ayuda! – Shailendra

+0

He agregado un enlace en la sección "ACTUALIZAR 2" que parece que hace lo que quiere hacer. – Shailendra

Cuestiones relacionadas