私は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.jarはEJBクライアント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にあるクラスが、ビジネスロジックコードによってエンティティとして認識されるようにするにはどうすればよいですか?