Comment valider le schéma de base de données en programmation avec annotations mise en veille prolongée?

StackOverflow https://stackoverflow.com/questions/2327423

Question

Il semble que l'objet org.hibernate.cfg.Configuration peut être utilisé pour effectuer la validation par programme, en appelant la méthode ValidateSchema. Cependant, cette méthode a besoin dialecte et objets DataBaseMetaData. J'utilise Spring et je peux obtenir une prise d'objet AnnotationSessionFactoryBean à partir du contexte du printemps. Jusqu'à présent, j'ai le code suivant:

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

Suis-je sur la bonne voie? ConnectionHelper hiérarchie ne soit pas visible de l'emballage de sorte que je ne peux pas obtenir la connexion objet de cette façon, afin de construire DatabaseMetaData. Comment puis-je mettre en œuvre cela?

EDIT: Je pense avoir fait des progrès. Il y a une classe SchemaValidator. Le code ressemble maintenant à ceci:

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

Howerver, maintenant je reçois l'erreur suivante:

org.hibernate.HibernateException: Pas DataSource locale trouvée pour la configuration - propriété 'dataSource' doit être réglé sur LocalSessionFactoryBean

Était-ce utile?

La solution

En fin de compte, lors de l'utilisation du printemps ce n'est pas aussi simple que cela. J'ai réussi à le faire prolonger la AnnotationSessionFactoryBean comme ceci:

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;
        }
    });

}
}

Autres conseils

Je l'ai trouvé une solution plus simple pour appeler mise en veille prolongée validation de cartographie qui fonctionne pour moi: LocalSessionFactoryBean.validateDatabaseSchema () (ce qui fait effectivement la même chose que le code dans la réponse de Dan ci-dessus)

@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(); 
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top