我在一个Hibernate项目中使用JPA,我需要在纯JDBC
级别执行一些操作,所以我用这个方法来获取与我的数据库的连接:
public class ConnectionUtil {
public static EntityManagerFactory EMF = Persistence
.createEntityManagerFactory("persistenceUnitName");
public static Connection getConnection() throws SQLException {
Connection connection = null;
EntityManager em = null;
try {
em = EMF.createEntityManager();
Session session = (Session)EMF.createEntityManager()
.getDelegate();
SessionFactoryImplementor sfi = (SessionFactoryImplementor) session
.getSessionFactory();
@SuppressWarnings("deprecation")
ConnectionProvider cp = sfi.getConnectionProvider();
connection = cp.getConnection();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (em != null) {
em.close();
}
}
return connection;
}
}
我使用这种方法将记录插入我的数据库:
public void saveOrUpdate(String sqlStatement, Connection connection, Object... args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sqlStatement);
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
preparedStatement.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (preparedStatement != null) {
preparedStatement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
实施如下:
saveOrUpdate("INSERT INTO my_table(my_column) VALUES (?)", ConnectionUtil.getConnection(), "MyValue");
没什么特别的。除了..它不起作用。没有例外,没有。但是没有插入记录。选择按预期工作。它返回记录。然后我换了连接。我以经典的方式创建了连接:
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","u","p");
通过了c
而不是ConnectionUtil.getConnection()
而且效果很好。
但是,遵循这种情况的逻辑问题是:
如果我无法使用getConnection
方法返回的连接插入记录,那么如果Hibernate
使用相同的连接,{{1}}如何插入记录?
答案 0 :(得分:1)
ConnectionProvider
并非供应用程序使用,请查看documentation
ConnectionProvider
接口不应向应用程序公开。相反,Hibernate在内部使用它来获取连接。
所以,更好的选择是你的第二种方法,以经典的方式获得连接。