0

助けてください、これは私を夢中にさせています。私はこれを何時間も調査してきましたが、私の状況に一致する例を見つけることができませんでした.

スタンドアロン クライアントからユーザーを認証する非常に単純な Java EE アプリを作成しています。Netbeans 7.3 では、EJB モジュールを含む Java EE アプリケーション プロジェクト、アプリケーション クライアント プロジェクト、および Bean のリモート インターフェイスとエンティティ用の別の Java クラス ライブラリを使用しています。

EJB モジュールには 1 つの Bean (AccountsBean.java) があり、クラス ライブラリ プロジェクトには Bean のリモート インターフェイス (AccountsBeanRemote.java)、エンティティ (Account.java)、および persistence.xml ファイルがあります。これはプロジェクトのレイアウトの写真で、はっきりと見ることができます: http://snag.gy/EoyQa.jpg

Account インスタンスをクライアントに渡したい。

Glassfish 3.1 と Java DB (Derby) を使用しています。

AccountsTest (ここで使用したい)、sample、sun-appserv-samples (これら 2 つは Glassfish のインストール中に作成されます) の 3 つのデータベースがあります。

問題は、persistence.xml で指定したデータベース接続に関係なく、テーブルは常にサンプル データベース sun-appserv-samples に作成されることです。Bean が persistence.xml ファイルを無視しているように思えます。おそらく問題は、persistence.xml が Bean とは別のプロジェクトにあることですが、アカウント インスタンスをリモート クライアントに渡したい場合、これが IDE で実行できる唯一の方法です。

ここに私のpersistence.xmlがあります:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="LoginTest-libPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>logintest.lib.Account</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/AccountsTest"/>
      <property name="javax.persistence.jdbc.password" value="app"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="javax.persistence.jdbc.user" value="app"/>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

そして AccountsBean.java:

@Stateless
public class AccountsBean implements AccountsBeanRemote {

    @PersistenceContext(unitName = "LoginTest-libPU")
    EntityManager em;

    @Override
    public Account create(String name, String password) {
        ...
    }

    @Override
    public void remove(int id) {
        ...
    }

    @Override
    public boolean checkPassword(int id, String password) {
        ...
    }
}

Account.java:

@Entity
@Table(name = "ACCOUNTS")
public class Account implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String password;

    public Account() {
    }

    ...other methods

EntityManager を正しく構成していないと思いますが、persistence.xml はどこに置くべきですか? それを EJB モジュールに入れると、エンティティーも EJB モジュールに入れる必要があり、クライアントはエンティティーにアクセスできなくなります。

前もって感謝します!

4

1 に答える 1

0

まず、Glassfish/Java EE ランタイムで何をしているのかを考えると、予想される動作に慣れていないため、なぜそのような動作が見られるのか正確にはわかりません。繋がり。代わりに、Java EE 環境では、「コンテナ管理の持続性ユニット」が必要です [推測: コンテナは jta-data-source を「sun-appserv-samples」にデフォルト設定しています]。

したがって、Java EE に接続を管理させます。

  1. Glassfish で、ID「TestAccountPool」で JDBC 接続プールを定義します。これは、管理パネルまたはコマンド ラインから実行できます。これにより、datasourceclassname ( Derby についてはこちらを参照)、トランザクション分離レベル、および次のような構成プロパティが指定されます。

    networkProtocol=jdbc\\:derby
    serverName=localhost
    port=1527  [OR portNumber=1527; I use port, some docs say portNumber]
    databaseName=AccountsTest
    user=app
    password=app
    
  2. 「TestAccountPool」を参照する JNDI 名「jdbc/TestAccountData」の JDBC リソースを定義します。

  3. JNDI 名を使用して管理されたデータベース接続を参照するようにpersistence.xmlファイルを調整します。

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0"
            xmlns="http://java.sun.com/xml/ns/persistence"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    
      <persistence-unit name="LoginTest-libPU" transaction-type="JTA">
    
        <jta-data-source>jdbc/TestAccountData</jta-data-source>
    
        <class>logintest.lib.Account</class>
    
        <properties>
          <property name="eclipselink.ddl-generation" value="create-tables"/>
        </properties>
      </persistence-unit>
    </persistence>
    

Java SE クライアントのサポート

エンティティを Java SE でも使用したい場合は、次のようにします。

  1. 最初に定義<persistence-unit> ... </persistence-unit>したものをpersistence.xmlファイルに追加します。

  2. この 2 番目の永続ユニットの名前を変更します。一意である必要があります。私のツール (グラスフィッシュ プラグインを使用した Eclipse) は、複数の永続化ユニットについて不平を言っています。私はそのような警告を無視します。

  3. トランザクション タイプを「JTA」から「RESOURCE_LOCAL」に変更するか、単純に削除します。Java EE コンテナでは、トランザクション タイプはデフォルトで JTA (仕様ごと) になり、Java SE ではデフォルトで RESOURCE_LOCAL になります。

  4. Java SE コード内の新しい永続ユニットに新しい名前を使用します。

于 2013-03-09T17:42:48.823 に答える