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 を使用して DB 資格情報を確認してみませんか? 少なくとも、JPA実装が接続を処理することを決定した方法とは無関係に機能します(JPA実装が接続を取得するためにそれ自体を使用していることはほぼ確実であるため、これらのJPAプロパティの名前には「jdbc」が含まれています)。

于 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、および properties。

name 属性は必須です。その他の属性と要素はオプションです。それらのセマンティクスについては、次のサブセクションで説明します。

Entity Manager は永続ユニット名のみDataNucleusを必要とするため、接続を作成する必要はありません。接続を検証するために単純な JDBC 接続を作成することをお勧めします。

于 2013-10-29T16:57:56.353 に答える