كيفية التحقق من صحة مخطط قاعدة البيانات برمجيا في السبات مع التعليقات التوضيحية؟
-
22-09-2019 - |
سؤال
يبدو أنه يمكن استخدام كائن 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();
}
}