كيفية التحقق من صحة مخطط قاعدة البيانات برمجيا في السبات مع التعليقات التوضيحية؟

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

سؤال

يبدو أنه يمكن استخدام كائن org.hibernate.cfg.configuration لإجراء التحقق من الصحة برمجيًا ، من خلال استدعاء طريقة التحقق من صحة. ومع ذلك ، فإن هذه الطريقة تحتاج إلى الكائنات لهجة و databasemetadata. أنا أستخدم الربيع ويمكنني الحصول على تعليق من التعليقات التوضيحية Factorybean من سياق الربيع. حتى الآن لدي الرمز التالي:

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

هل أنا على الطريق الصحيح؟ التسلسل الهرمي للاتصال Helper غير مرئي خارج الحزمة ، لذلك لا يمكنني الحصول على كائن الاتصال بهذه الطريقة ، من أجل إنشاء Databasemetadata. كيف يمكنني تنفيذ هذا؟

تحرير: أعتقد أنني أحرزت بعض التقدم. هناك فئة Schemavalidator. يبدو الرمز الآن هكذا:

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

Howerver ، الآن أحصل على الخطأ التالي:

org.hibernate.hibernateException: لم يتم العثور على خاصية بيانات محلية للتكوين - خاصية "DataSource"

هل كانت مفيدة؟

المحلول

في النهاية ، عند استخدام الربيع ، هذا ليس بهذه البساطة. تمكنت من القيام بذلك لتوسيع نطاق التعليقات التوضيحية مثل هذا:

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

}
}

نصائح أخرى

لقد وجدت حلاً أبسطًا لاستدعاء التحقق من صحة رسم الخرائط السباتية الذي يعمل بالنسبة لي: alblovessessionfactorybean.validatedatabaseschema () (وهو ما يفعل نفس الشيء مثل الكود في إجابة دان أعلاه)

@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(); 
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top