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(";");
    }
}
¿Fue útil?

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 :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top