0

我在 JavaSE 应用程序中使用 JPA 并编写了一个类来管理数据库连接并将对象持久保存到数据库中。数据库连接的连接参数使用类构造函数传递,并且该类具有验证连接参数的方法。

public class DatabaseManager{

    private EntityManagerFactory entityManagerFactory = null;

    public DatabaseManager(String connectionDriver, String connectionUrl, String username, String password) {

        Properties props = new Properties();

        props.put("javax.persistence.jdbc.driver", connectionDriver);
        props.put("javax.persistence.jdbc.url", connectionUrl);
        props.put("javax.persistence.jdbc.user", username);
        props.put("javax.persistence.jdbc.password", password);

        entityManagerFactory = Persistence.createEntityManagerFactory("name of persistence unit", props);
    }

    public boolean checkConnection(){

        try{
            entityManagerFactory.createEntityManager();
        }catch(Exception e){
            return false;
        }

        return true;
    }
}

当我调用 checkConnection 方法时,它会尝试使用给定的参数创建一个新的实体管理器。如果无法建立连接,entitymanagerfactory 会抛出异常并且该方法返回 false。
当我测试该方法时,我可以看到以下结果:

  • 所有参数都正确 -> 该方法按预期返回 true。
  • URL 或用户名不正确 -> 该方法按预期返回 false。
  • 驱动程序名或用户密码不正确 -> 该方法返回 true 但它应该返回 false。<-这是我的问题。

    有人能告诉我为什么它会这样吗?在不将数据写入某些数据库表的情况下测试连接参数的正确方法是什么?
    目前我正在使用 EclipseLink,但我正在寻找一些独立于提供商的方式。

    感谢您的回答。
4

2 回答 2

0

创建 EntityManager 时不必创建任何连接。例如,JPA 实现可能会延迟获取连接,直到第一次持久化或刷新(JPA 规范不会定义何时必须获取连接)。

为什么不只使用几行简单的 JDBC 来检查您的数据库凭据?至少这种方式独立于 JPA 实现决定如何处理连接(并且这些 JPA 属性在名称中具有“jdbc”,因为几乎可以肯定这就是 JPA 实现使用自身来获取连接的方式)。

于 2013-10-29T16:22:40.180 回答
0

JPA 2.0 Specification部分8.2.1

persistence-unit 元素由 name 和 transaction-type 属性以及以下子元素组成:description、provider、jta-data-source、non-jta-data-source、mapping-file、jar-file、class、exclude -unlisted-classes、shared-cache-mode、validation-mode 和属性。

name 属性是必需的;其他属性和元素是可选的。它们的语义在以下小节中描述。

Entity Manager 不需要创建连接,因为它只需要Persistence Unit 名称,我认为您应该建议DataNucleus您建立一个简单的 JDBC 连接来验证您的连接。

于 2013-10-29T16:57:56.353 回答