過去在Hibernate3取回Connection
Connection conn = ((org.hibernate.internal.SessionFactoryImpl)((org.hibernate.Session)em.getDelegate()).getSessionFactory()).getCurrentSession().getConnectionProvider().getConnection();
現在在Hibernate4、5拿掉了SessionFactoryImpl下的getConnectionProvider()方法;改用doWork方式。
根據網頁上的討論說法:
http://stackoverflow.com/questions/5640778/hibernate-sessionfactory-vs-entitymanagerfactory
// 好像不該這樣用!
// // // Session session = ((org.hibernate.internal.SessionFactoryImpl)((org.hibernate.Session)em.getDelegate()).getSessionFactory()).getCurrentSession();
// // // 這樣好像也沒比較好!
// Session session = em.unwrap(Session.class);
// SessionFactoryImplementor sfi = (SessionFactoryImplementor) session.getSessionFactory();
// ConnectionProvider cp = sfi.getConnectionProvider();
// Connection conn = cp.getConnection();
Session session = em.unwrap(Session.class);
session.beginTransaction();
rtn = session.doReturningWork(new ReturningWork<String>(){
@Override
public String execute(Connection conn) throws SQLException {
}
});
session.getTransaction().commit();
session.close();
2017-10-23編輯:
參考:https://stackoverflow.com/questions/44330497/hibernate-4-1-to-5-1-sessionfactory-connectionprovider
發現Hibernate 4.x 這樣取得Connection在執行Stored Procedure會重複出現兩筆資料!
// // // Connection con = ((SessionImpl)((HibernateEntityManager) em).getSession()).connection();
因此務必改成以下就會正確!
Connection con = ((org.hibernate.engine.SessionFactoryImplementor) ((org.hibernate.Session) em.getDelegate()).getSessionFactory()).getConnectionProvider().getConnection();