2011-12-27 11 views
5

Tengo una base de datos mysql que deseo agregar la funcionalidad de agregar una nueva tabla a la base de datos. Probablemente podría encontrar fácilmente el ejemplo de JPQL para esto, pero ¿cómo generaría automáticamente la entidad para esta nueva tabla para poder hacer referencia a ella en el resto de mi código JPA para actualizar y eliminar de la tabla que normalmente hago referencia a la entidad? no la mesa real en sí.Forma de Java EE/JPA para agregar nuevas tablas/entidades a la base de datos

Las entidades que tengo ahora he usado eclipe para generar a partir de las tablas que creé. Pero después del despliegue, obviamente no tendremos Eclipse para hacer esto, así que lo necesitamos de forma automática cada vez que se crea una tabla.

Respuesta

7

Crear y asignar nuevas tablas dinámicamente no es algo que JPA apoye. Necesitaría crear nuevas clases de Java sobre la marcha y actualizar dinámicamente los metadatos de la asignación. Puede hacer todo lo que quiera con JDBC o consultas nativas. Pero tal vez deberías explicar por qué necesitas crear nuevas tablas sobre la marcha.

+0

No sé si necesitaré crear tablas con mucha frecuencia. Creo que si crea su esquema correctamente, debería crear nuevas tablas. Pero si lo hiciéramos, siempre podría tomar el proyecto del servidor para reconstruir y desplegar con las nuevas asignaciones. Solo quería saber si era posible porque alguien me preguntó si podía hacerlo. – Randnum

+0

Para agregar una nueva asignación, de hecho tendrá que volver a implementar una nueva versión de su aplicación. Probablemente también deba ejecutar algún script de migración de esquema, porque hay una buena probabilidad de que esta nueva tabla afecte a las existentes (nuevas claves externas, cambios de diseño, etc.). Solo asegúrese de probar todo el procedimiento antes de hacerlo en su servidor de producción para asegurarse de que el tiempo de inactividad sea lo más breve posible. –

+0

Buen punto. Aunque creo que al menos para la pregunta que se me planteó, estas tablas serían independientes de las otras tablas sin relaciones ni claves.Pero para generar las entidades que tendría que volver a desplegar, sería una mala idea. – Randnum

1

puede configurar sus propiedades de hibernación o persistence.xml para actualizar db en los inicios del servidor. hará las actualizaciones de la tabla de forma automática. mira junto al parámetro hibernateDialect.

<property name="hibernate.hbm2ddl.auto" value="update" /> 

es lo que quieres. No creo que quiera crear clases de entidades sobre la marcha y querer crear tablas sin redesplegarse como dice @JB Nizet en su respuesta.

3

Hay varias maneras de crear las tablas. El uso más común para producción es que el DBA (o desarrollador en ese rol) crea el esquema de base de datos (tablas, etc.) independientemente de la aplicación.

Esto es típico, ya que la aplicación modela los datos en la base de datos, y hay una opinión común que dice que la base de datos normalmente sobrevive a la aplicación.

Es posible dejar que el proveedor de JPA cree automáticamente el esquema. Incluso hay un par de atributos en las anotaciones JPA que son específicamente para este propósito (por ejemplo, el atributo nullableJoinColumn).

Activando esto sucede con las propiedades específicas del proveedor en persistence.xml. P.ej. hibernate.hbm2ddl.auto para Hibernate (como se usa en JBoss AS) y eclipselink.ddl-generation para EclipseLink (como se usa en GlassFish).

Vea http://wiki.eclipse.org/EclipseLink/Examples/JPA/Migration/JBoss para algunos ejemplos.

Insertar una entidad en una tabla es algo completamente diferente. De tu pregunta de alguna manera tienes la sensación de que quizás no entiendas completamente la diferencia entre esos dos. Sucede a través de, por ejemplo, EntityManager#persist, pero no estoy 100% seguro de si esto es lo que estás preguntando.

Cuestiones relacionadas