使用Hibernate的過程中,有時候需要直接使用SQL語句來操作數(shù)據(jù)庫(雖然Hibernate不推薦使用,但是有時候還是會使用到的,比如說批處理),這個時候就要求我們首先獲得JDBC的連接。獲得JDBC連接的方式有:
1、先獲得Session,然后從Session中獲得連接
session.connection();
但是這個方法Hibernate不推薦使用,The method connection() from the type Session is deprecated
在3.3以后的版本中已經(jīng)被廢除了。
2、通過ConnectionProvider來獲得連接
這樣也可以獲得連接。但是實驗后發(fā)現(xiàn),通過JDBC連接插入的數(shù)據(jù),然后通過Hibernate獲取不到。查看數(shù)據(jù)庫發(fā)現(xiàn)數(shù)據(jù)已經(jīng)插入到了數(shù)據(jù)庫中,另外Hibernate重新加載后也可以看到剛才插入的數(shù)據(jù)。
剛開始的時候,以為是Hibernate二級緩存的原因,但是把Hibernate的二級緩存關(guān)掉以后,任然有這個問題。經(jīng)過多方查找,最后在Hibernate的官方找到了解決辦法,如下:
就是直接從SessionFactory中獲得ConnectionProvider ,而不是自己創(chuàng)建一個。自己猜想原因應(yīng)該是通過SessionFactory獲得的連接和自己構(gòu)造ConnectionProvider 來獲得的連接應(yīng)該是獨立的,所以導(dǎo)致通過JDBC插入的數(shù)據(jù)在Hibernate下看不到。
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/HibernateTest?user=root&password=";
java.sql.Connection conn = DriverManager.getConnection(url);
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession(conn);
3.3官方的替代方法是用Session.doWork(Work work);
傳入的參數(shù)work是一個接口,可以HibernateFactory.getSession().doWork(
new Work() {
public void execute(Connection connection) {
// 這里面就得到connection了,