tutorial principales integracion con aprender anotaciones java hibernate jpa orm hibernate-mapping

java - principales - ¿Cómo configuro el nombre de la tabla JPA en tiempo de ejecución?



spring java hibernate (2)

Tengo un problema donde solo tengo una base de datos para usar, pero tengo varios servidores en los que quiero que utilicen un nombre de tabla diferente para cada servidor.

En este momento mi clase está configurada como:

@Entity @Table(name="loader_queue") class LoaderQueue

Quiero poder tener el punto de servidor dev1 en la tabla loader_queue_dev1, y el punto de servidor dev2 en la tabla loader_queue_dev2, por ejemplo.

¿Hay alguna manera de hacerlo con o sin anotaciones?

Quiero poder tener una compilación única y luego, en tiempo de ejecución, usar algo así como una propiedad del sistema para cambiar el nombre de la tabla.


Puede utilizar una estrategia de nombres personalizada que genere el nombre de la tabla de forma dinámica en el tiempo de ejecución. El nombre del servidor podría ser proporcionado por una propiedad del sistema, por lo que su estrategia podría verse así:

public class ServerAwareNamingStrategy extends ImprovedNamingStrategy { @Override public String classToTableName(String className) { String tableName = super.classToTableName(className); return resolveServer(tableName); } private String resolveServer(String tableName) { StringBuilder tableNameBuilder = new StringBuilder(); tableNameBuilder.append(tableName); tableNameBuilder.append("_"); tableNameBuilder.append(System.getProperty("SERVER_NAME")); return tableNameBuilder.toString(); } }

Y proporcione la estrategia de nomenclatura como propiedad de configuración de Hibernate:

<property name="hibernate.ejb.naming_strategy" value="my.package.ServerAwareNamingStrategy"/>


Yo no haría esto. Está muy en contra del grano de JPA y es muy probable que cause problemas en el futuro. Prefiero agregar una capa de vistas a las tablas que proporcionen nombres unificados para su aplicación.

Pero preguntaste, así que ten algunas ideas de cómo podría funcionar:

  1. Es posible que pueda crear la asignación para sus clases, completamente por código. Es probable que sea tedioso, pero le da flexibilidad total.

  2. Puede implementar una NamingStrategy que traduzca su nombre de clase a nombres de tabla, y depende de la instancia en la que se esté ejecutando.

  3. Puede cambiar su código durante el proceso de compilación para construir dos (o más) artefactos de una fuente.