0

私はEJB3コードを次のように分解しました。

(i)「 EJBクライアントjar 」の構築に使用されるビジネスロジックインターフェイスとPOJOエンティティBean 、および

(ii)ビジネスインターフェイスを実装し、データベースでJPAを実行するビジネスロジックコード。

デプロイされたプラットフォームは、HibernateJPAを備えたJBossAS7.1です。

EJBクライアントjarは、ビジネスロジックコードにアクセスする1つまたは複数の戦争展開されるインターフェイスであるという考え方です。私はEJB3ビジネスロジックコードを内部にWARがないEARとしてデプロイしています(WAR独立てデプロイされています)。したがって、最上位のビジネスロジックEARの構造は次のようになります。

.
├── lib
│   ├── commons-lang3-3.1.jar
│   └── Users-client.jar
├── META-INF
│   ├── application.xml
│   └── MANIFEST.MF
└── Users-ejb.jar

上記の私の場合、Users-client.jarEJBクライアントjar(インターフェース)であり、Users-ejb.jarはビジネスロジックの実装とJPAコードです。

ビジネスロジック実装コード(Users-ejb.jar)の構造は次のとおりです。

├── base
│   └── AbstractFacade.class
├── facades
│   ├── PrivateUserDataFacade.class
│   └── UserFacade.class
├── META-INF
│   ├── MANIFEST.MF
│   ├── persistence.xml
│   └── postgres-ds.xml
└── utils
    └── JPUtil.class

persistence.xmlに次のタグが含まれている場合:

 <exclude-unlisted-classes>false</exclude-unlisted-classes>  

ただし、上記の設定では、Users-ejb.jarのコードは、 Users-client.jarをエンティティとして定義した@EntityBeanを認識しません。これは、コードがコンパイルおよびデプロイされるときにクラスが見つからない問題ではなく、実行時に「エンティティではない」例外がスローされます。

したがって、たとえば、クラスUserFacade.classの次のテストメソッド:

public String boo(String name)
{                                                                   
    javax.persistence.criteria.CriteriaQuery cq =
      getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(User.class)); // <-- exception thrown
    List<User> all = getEntityManager().createQuery(cq).getResultList();
    return "boo"+name;
}             

トレースでマークされている場所で失敗します:

Caused by: java.lang.IllegalArgumentException: Not an entity: class entities.User
at org.hibernate.ejb.metamodel.MetamodelImpl.entity(MetamodelImpl.java:158)
[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.ejb.criteria.QueryStructure.from(QueryStructure.java:136)
[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
at org.hibernate.ejb.criteria.CriteriaQueryImpl.from(CriteriaQueryImpl.java:177)
[hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
at facades.UserFacade.boo(UserFacade.java:46) [Users-ejb.jar:]

lib / Users-client.jarにあるクラスが、ビジネスロジックコードによってエンティティとして認識されるようにするにはどうすればよいですか?

4

1 に答える 1

2

でエンティティを定義するperistence.xml

  <persistence-unit name="YourUnit">
     <class>com.package.User</class>
     <class>com.package.AnotherEntity</class>
...
于 2012-08-14T13:56:23.430 に答える