9

Netbean6.9.1 と JPA EclipseLink を使用して REST Web アプリを構築しています。

私が直面している問題は、エンティティ クラス MasatoTable が Entity アノテーションでマークされていても、エラーが発生することです:

    (java.lang.IllegalArgumentException: Unknown entity bean class:
     class entity.MasatoTable, please verify that this class
 has been marked with the @Entity annotation.)

問題は、NetbeanIDE から GlassFish3 サーバーを再起動すると、しばらくの間動作し、ある時点でエラーが表示され始めることです。以前は Toplink Essential を使用していましたが、問題はありませんでしたが、EclipseLink に変更して persistence.xml を再定義し (以下に示す)、この問題が発生しました。しかし、私が考えることができるコードエラーは見られません..

MasatoTable.java

@Entity
@Table(name = "MasatoTable")
public class MasatoTable implements Serializable {
...continue code...

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="kojoPU">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <non-jta-data-source>jdbc/koga_kojo</non-jta-data-source>
    <class>entity.MasatoTable</class>
    <properties>
      <property name="eclipselink.logging.logger" value="JavaLogger"/>
      <property name="eclipselink.logging.level.sql" value="FINEST"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://KOGADBSERVER;databaseName=MasatoDB"/>
      <property name="javax.persistence.jdbc.password" value="foobar"/>
      <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
      <property name="javax.persistence.jdbc.user" value="koga"/>
    </properties>
  </persistence-unit>
</persistence>

同じ問題のように見えますが、そのチケットの解決策は、Eclipselink から Toplink にロールバックすることです。トップリンクにロールバックせずに問題を解決した人はいますか?

ホットデプロイ後の不明なエンティティ Bean クラス: netbeans 6.9 + glassfish 2.1 + eclipselink jpa 2.0

アップデート

このケースに関する私の調査によると、バグは解決され、修正されているように見えますか?

https://bugs.eclipse.org/bugs/show_bug.cgi?id=288141

私は全体を理解するのに十分な知識はありませんが、私が見つけたいくつかの事実があります:

Netbean6.9.1 は EclipseLink 2.0.1 を提供しますが、最新バージョンは 2.2.0 です。

最新バージョンをダウンロードして lib ディレクトリに配置し、再展開しましたが、問題は解決しません。私が間違った方法で物事を行ったかどうかはわかりません。

ジェームズのコメント後の更新

以下は、シングルトン EntityManagerFactory を作成するために使用するクラスと、その使用方法です。

package common;

import java.util.Date;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EmProvider {

    private static final String DB_PU = "kojoPU"; //工場DB

    public static final boolean DEBUG = false;

    private static final EmProvider singleton = new EmProvider();

    private EntityManagerFactory emf;

    private EmProvider() {}

    public static EmProvider getInstance() {
        return singleton;
    }


    public EntityManagerFactory getEntityManagerFactory() {
        if(emf == null) {
            emf = Persistence.createEntityManagerFactory(DB_PU);
        }
        if(DEBUG) {
            System.out.println("factory created on: " + new Date());
        }
        return emf;
    }

    public void closeEmf() {
        if(emf.isOpen() || emf != null) {
            emf.close();
        }
        emf = null;
        if(DEBUG) {
            System.out.println("EMF closed at: " + new Date());
        }
    }

}//end class

使用方法:

EntityManager em = null;
   Object out = null;
   try {
       em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
       Query query = em.createNativeQuery(sql);

       ....some code here
   }
   finally {
       if(em != null) {
           em.close();
       }
   }

私のコードを見ると、私は思います...私はEntityManagerFactoryを閉じていません(しかし、最終的にEntityManagerを閉じています)

"unknown entity bean class"また、次のアクションでトピックのエラーが確実に表示されることもわかりました。

  1. Netbean を介して Web アプリをデプロイします (これによりブラウザーが開きます)

  2. Netbean IDE でいくつかのコードを変更して保存します。次に、保存ボタンを押すとすぐにNetbeanが自動再デプロイされます(これは「ホットデプロイ」と呼ばれますか???)

  3. ブラウザーに戻り、EntityManager に関連するデータを追加するなどのアクションを実行します。

ホット デプロイ時にエンティティ マネージャ ファクトリを閉じていないため、エラーが発生したように見えますか? 私は調査しなければなりません。

4

3 に答える 3

6

EntityManager/Factory をどのように作成していますか? 管理されているか、管理されていませんか?

管理されていない場合、EclipseLink は再デプロイの通知を受けないため、古い EntityManagerFactory は閉じられないためキャッシュされたままになると思います。ホットデプロイ後に EntityManagerFactory を確実に閉じることができますか?

持続性ユニットをマネージド持続性ユニットにすることで、問題を解決できる場合があります。

いずれにせよ、この問題は追跡する必要があるため、EclipseLink と Glassfish に詳細を記載してバグを記録してください。

これはバグかもしれないと思いますhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=326552

このバグに投票し、あなたの情報を含めてください。

于 2011-03-02T14:10:58.070 に答える
2

ここでの解決策は、2.0 が必要ない場合は JPA 1.0 を使用することです。

于 2011-02-25T07:43:21.093 に答える
-1

Today i faced the same proble, but i corrected in persistence.xml

  1. Please check with entity class name and package are correctly defined in persistence.xml.
于 2011-02-28T08:49:03.420 に答える