2010-02-24 11 views
5

Parece que el objeto org.hibernate.cfg.Configuration se puede usar para realizar la validación mediante programación llamando al método validateSchema. Sin embargo, este método necesita objetos dialect y databaseMetadata. Estoy usando Spring y puedo acceder al objeto AnnotationSessionFactoryBean desde el contexto de primavera. Hasta ahora tengo el siguiente código:¿Cómo validar el esquema de la base de datos mediante programación en hibernación con anotaciones?

AnnotationSessionFactoryBean factory = null; 
    factory = (AnnotationSessionFactoryBean) context.getBean("AnnotationSessionFactory"); 
    Configuration configuration = factory.getConfiguration(); 

    //the following line does not work, ConnectionHelper hierarchy is not visible outside the package 
    ConnectionHelper connectionHelper = 
    new ManagedConnectionProviderConnectionHelper(factory.getHibernateProperties()); 

    Dialect dialect = Dialect.getDialect(factory.getHibernateProperties()); 
    Connection connection = null; 
    DatabaseMetadata databaseMetadata = null; 
    try { 
     databaseMetadata = new DatabaseMetadata(connection, dialect); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    configuration.validateSchema(dialect, databaseMetadata); 

¿Estoy en el camino correcto? La jerarquía de ConnectionHelper no está visible fuera del paquete, por lo que no puedo obtener el objeto de conexión de esa manera, para construir DatabaseMetadata. ¿Cómo puedo implementar esto?

EDIT: Creo que he hecho algunos progresos. Hay una clase SchemaValidator. El código ahora se ve así:

AnnotationSessionFactoryBean factory = context.getBean("&AnnotationSessionFactory"); 
Configuration configuration = factory.getConfiguration();  
SchemaValidator validator = new SchemaValidator(configuration); 
validator.validate();  

Howerver, ahora estoy consiguiendo el error siguiente:

org.hibernate.HibernateException: Sin fuente de datos locales que se encuentran para la configuración - propiedad 'dataSource' se debe establecer en LocalSessionFactoryBean

Respuesta

4

Al final, al usar Spring esto no es tan simple. Me las arreglé para hacerlo extendiendo el AnnotationSessionFactoryBean así:

public class SchemaValidatingAnnotationSessionFactoryBean extends 
    AnnotationSessionFactoryBean { 

public void validateDatabaseSchema() throws DataAccessException { 
    logger.info("Validating database schema for Hibernate SessionFactory"); 
    HibernateTemplate hibernateTemplate = new HibernateTemplate(
      getSessionFactory()); 
    hibernateTemplate.setFlushMode(HibernateTemplate.FLUSH_NEVER); 
    hibernateTemplate.execute(new HibernateCallback() { 
     public Object doInHibernate(Session session) 
       throws HibernateException, SQLException { 
      Connection con = session.connection(); 
      Dialect dialect = Dialect.getDialect(getConfiguration() 
        .getProperties()); 
      DatabaseMetadata metadata = new DatabaseMetadata(con, dialect); 
      Configuration configuration = getConfiguration(); 
      configuration.validateSchema(dialect, metadata); 
      return null; 
     } 
    }); 

} 
} 
1

He encontrado una solución más simple para invocar la validación de asignación de hibernación que funciona para mí: LocalSessionFactoryBean.validateDatabaseSchema() (que efectivamente hace lo mismo que el código en la respuesta de Dan anterior)

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "/some-test-context.xml" }) 
public class TestMapping { 

    @Autowired 
    ApplicationContext context; 

    @Test 
    public void validateSchema() { 
     AnnotationSessionFactoryBean factory = (AnnotationSessionFactoryBean)context 
       .getBean("&mySessionFactory"); 
     factory.validateDatabaseSchema(); 
    } 
} 
Cuestiones relacionadas