Разрешить диалект SQL с помощью гибернации
Я отвечаю за перенос существующего проекта из Oracle на MSSQL, но сохраняю оба функционала. Устаревший проект использует Hibernate 3.x, но содержит некоторое количество сложных нативных запросов. Поэтому я хотел бы знать, какой диалект используется.
4 ответа
Наконец-то я нашел способ, но он специфичен для Hibernate.
//take from current EntityManager current DB Session
Session session = (Session) em.getDelegate();
//Hibernate's SessionFactoryImpl has property 'getDialect', to
//access this I'm using property accessor:
Object dialect =
org.apache.commons.beanutils.PropertyUtils.getProperty(
session.getSessionFactory(), "dialect");
//now this object can be casted to readable string:
if( dialect.toString().contains("Oracle")){
....
Еще один способ немного короче:
private @Autowired SessionFactory sessionFactory;
public Dialect getDialecT(){
SessionFactoryImplementor sessionFactoryImpl = (SessionFactoryImplementor) sessionFactory;
return sessionFactoryImpl.getDialect();
}
Вот еще одно решение, специфичное для Hibernate. Это все еще уродливо, потому что включает в себя броски вниз, но не использует отражения:
Session session = (Session) entityManager.getDelegate();
SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) session.getSessionFactory();
Dialect dialect = sessionFactory.getDialect();
if (dialect.toString().contains("Oracle")) { ... }
После обновления сервера устаревший системный код Java перестал работать и начал возвращать сообщение об ошибке «java.lang.NoSuchMethodException: Unknown property 'dialect' on class 'class org.hibernate.internal.SessionFactoryImpl'». Итак, чтобы исправить проблему и свести к минимуму возможные последствия, была произведена следующая корректировка:
До:
Session session = (Session) entityManager.getDelegate();
SessionFactory factory = session.getSessionFactory();
Object dialect = null;
try {
dialect = PropertyUtils.getProperty(factory, "dialect");
} catch (Exception e) {
log.error("Error to get dialetic from entity manager", e);
}
После:
Session session = (Session) entityManager.getDelegate();
SessionFactory factory = session.getSessionFactory();
Object dialect = null;
try {
dialect = PropertyUtils.getProperty(factory, "dialect");
} catch (Exception e1) {
log.error("Error to get dialetic from entity manager", e1);
try {
SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) session.getSessionFactory();
dialect = sessionFactory.getDialect();
} catch (Exception e2) {
log.error("Error to get dialetic from entity manager", e2);
}
}
Примечание . Ошибка начала возникать после обновления jboss/wildfly.