2012-02-28 3 views
37

Я хочу получить соединение jdbc из сеанса спящего режима. Существует метод внутри сеанса hibernate i.e session.connection(); но он устарел. Я знаю, что это работает еще, но я не хочу использовать устаревший метод, так как я уверен, что они должны предоставить альтернативу для этого? В http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html метод соединения api говорит, используя org.hibernate.jdbc.Work для этой цели, но я не нашел для этого примера?Как получить соединение jdbc из сеанса спящего режима?

+2

Если кто-то помечает вопрос как дубликат пожалуйста, укажите ссылку на один из других вопросов, на которые уже есть ответ, –

ответ

74

Вот как вы можете использовать его:

session.doWork(new Work() { 
    @Override 
    public void execute(Connection connection) throws SQLException { 
     //connection, finally! 
    } 
}); 
+0

Вопрос: Я получаю ' doWork недействительно без активной транзакции' с этим кодом, как мне начать транзакцию? – OscarRyz

+2

@OscarRyz: если вы используете Spring, '@ Transactional' или' TransactionTemplate' достаточно. В необработанном Hibernate вы должны [запустить 'session.beginTransaction()' вручную] (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-basics). –

+0

Привет, приятель. Хороший ответ, но doWork() также устарел. – Logicalj

11

У меня была аналогичная проблема, и я использовал ConnectionProvider класс, чтобы получить соединение. Смотрите мое решение:

Session session = entityManager.unwrap(Session.class); 
SessionFactoryImplementor sessionFactoryImplementation = (SessionFactoryImplementor) session.getSessionFactory(); 
ConnectionProvider connectionProvider = sessionFactoryImplementation.getConnectionProvider(); 
try { 
     connection = connectionProvider.getConnection(); 
     ... 
} 
+1

Можете ли вы добавить краткое объяснение как это решает проблему? – Ren

+4

sessionFactoryImplementation.getConnectionProvider() лишен – vels4j

21

Попробуйте это:

((SessionImpl)getSession()).connection() 
+6

Кому-то, кто попадает сюда не у дел (как и я): ['Session.connection'] (http://docs.jboss.org/hibernate/core/3.5/api/org/ hibernate/Session.html # connection% 28% 29) метод в настоящее время устарел. – Dinei

+2

никогда не бросается на Impl! его внутренний! (Org.hibernate.internal.SessionImpl). И вы больше не можете тестировать этот код с макетом. Это плохо по многим причинам. – Rainer

Смежные вопросы