0

ここまでで、次のコードを介して Shipvia エンティティ クラスを利用する 1 つの画面を備えた完全に機能する NetBeans プラットフォーム アプリケーションが完成しました。

import entity.Shipvia;
import entity.Route;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class RetrieveResultList {

    public static List RetrieveResultList (String tablename){
        EntityManager entityManager = Persistence.createEntityManagerFactory("EntityLibraryPU").createEntityManager();
        System.out.println("NAMED QUERY:>"+tablename+".findAll");
        Query query = entityManager.createNamedQuery(tablename+".findAll");
        List<Shipvia> resultList = query.getResultList();
        return resultList;
    }
}

ご覧のとおり、渡されたテーブル名に基づいて動的クエリを作成します。したがって、ユーザーが ShipviaTopComponent を開くと、Shipvia.findAll が呼び出されます (以下のエンティティ クラスの一部を参照)。

package entity;

import java.io.Serializable;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@Table(name = "SHIPVIA")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Shipvia.findAll", query = "SELECT c FROM Shipvia c")
});

私の目標は、RouteTopComponent という 2 番目の画面で Route エンティティ クラスを利用することです。

package entity;

import java.io.Serializable;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@Table(name = "ROUTE")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Route.findAll", query = "SELECT c FROM Route c")
});

ただし、ルート画面を開こうとすると、次のエラーが表示されます。

SEVERE [global]
java.lang.IllegalArgumentException: NamedQuery of name: Route.findAll not found.
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getDatabaseQueryInternal(EJBQueryImpl.java:577)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1043)
    at com.demo.viewer.RetrieveResultList.RetrieveResultList(RetrieveResultList.java:23)
    at com.demo.viewer.RoutesTopComponent.<clinit>(RoutesTopComponent.java:40)
Caused: java.lang.ExceptionInInitializerError
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

RouteTopComponent の 40 行目は次のとおりです。

List<Route> resultList = RetrieveResultList.RetrieveResultList("Route");

ShipviaTopComponentを開いてShipvia.findAllを見つけてもRouteTopComponent/Route.findAllを見つけられないのはなぜですか?

4

1 に答える 1

0

コメントで説明されているように、Java SE 環境で RESOURCE_LOCAL transaction-type/running JPA を使用している場合は、persistence.xml ファイルにエンティティ クラスを明示的にリストする必要があります。

于 2012-05-28T14:15:00.937 に答える