Clonar la definición de una tabla con Hibernate (hbm2ddl)
-
11-09-2019 - |
Pregunta
En mi solicitud de hibernación existe anotación objeto desplazado: AuditEvent . Es muy simple y no tiene relaciones de clave externa. Cómo archivo entradas antiguas en esta tabla con moverlos a otra tabla OldAuditEvent , que es un clon de la AuditEvent mesa.
Ahora generamos el DDL para toda la aplicación utilizando hbm2ddl (en nuestro modelo de datos anotada) y copiar / pegar manualmente la tabla AuditEvent y cambiar su nombre para crear OldAuditEvent .
Quiero automatizar el proceso de construcción, ¿hay alguna manera de saber hbb2ddl: "oye tomar esta entidad, cambiar el nombre de la tabla a X y regenerar es DDL"
Actualizar : Yo era capaz de conseguir este trabajo por el enfoque ha rememorado. El único problema estaba en el AnnotationSessionFactoryBean ya que es un grano de la fábrica y la primavera sólo le dará la salida de la fábrica. He creado ConfigExposingAnnotationSessionFactoryBean (que se extiende AnnotationSessionFactoryBean) para exponer la fábrica de beans a través de una estática -. Una especie de truco, pero lo único que quiero hacer es ejecutar una tarea de tiempo de construcción
Configuration cfg = ConfigExposingAnnotationSessionFactoryBean.s_instance.getConfiguration();
PersistentClass pClass = cfg.getClassMapping("com.myco.LoginAttempt");
pClass.getTable().setName("ArchiveLoginAttempt");
Dialect dialect = Dialect.getDialect(ConfigExposingAnnotationSessionFactoryBean.s_instance.getHibernateProperties());
// only output create tables, not indexes or FK
for (String s : cfg.generateSchemaCreationScript( dialect )) {
if (s.contains("create table") && s.contains("Archive")) {
m_outstream.print(s);
m_outstream.println(";");
}
}
Solución
Es factible, pero en lugar desordenado y, muy probablemente, no vale la pena en este caso.
Usted tendrá que modificar dinámicamente href="https://www.hibernate.org/hib_docs/v3/api/org/hibernate/cfg/Configuration.html" objeto antes SessionFactory se construye. Me estás usando Spring, esto se puede hacer reemplazando método postProcessAnnotationConfiguration()
de AnnotationSessionFactoryBean
; de lo contrario, sólo tendrá que hacer uso de su objeto Configuration
antes de invocar buildSessionFactory()
en él.
Usted puede obtener acceso a las asignaciones de clase / de mesa a través de configuration.getMappings()
. A continuación, tendrá que encontrar su mapeo de la tabla a través de getTable()
, crear una copia con nuevo nombre a través de addTable()
y replicar todas las columnas / teclas a través de API Tabla .
A continuación, puede generar la secuencia de comandos DDL través generateSchemaCreationScript()
o generateSchemaUpdateScript()
métodos de objeto Configuration
.
Como ya he dicho, probablemente no vale la pena en este caso :-)