如何验证JPA连接属性?

时间:2013-10-29 14:33:12

标签: java validation jpa parameters connection

我在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方法时,它会尝试使用给定的参数创建一个新的entitymanager。如果无法建立连接,则entitymanagerfactory会抛出异常,并且该方法返回false 当我测试方法时,我可以看到以下结果:

  • 所有参数均正确 - >该方法按预期返回true。
  • 网址或用户名不正确 - >该方法按预期返回false。
  • drivername或用户密码不正确 - >该方法返回true但它应返回false。 < - 这是我的问题。

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

    谢谢你的回答。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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和properties。

     

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

实体管理器不需要创建连接,因为 ONLY 需要持久性单元名称,我认为你应该使用DataNucleus建议来建立一个简单的JDBC连接来验证你的联系。