Разрешить диалект 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.

Другие вопросы по тегам