Hibernate返回“怪异”的连接

时间:2015-02-18 16:07:45

标签: java mysql hibernate jpa

我在一个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}}如何插入记录?

1 个答案:

答案 0 :(得分:1)

ConnectionProvider并非供应用程序使用,请查看documentation

  

ConnectionProvider接口不应向应用程序公开。相反,Hibernate在内部使用它来获取连接。

所以,更好的选择是你的第二种方法,以经典的方式获得连接。