私は、JDO をインジェクト (または最適な初期化) する最もクリーンな方法を探しています。JDOPersistenceManager
および/またはPersistenceManagerFactory
JAX-RS / Jersey 2 および EJB 3.1 Lite に基づいた RESTful Web アプリケーション リソースに、できれば余分な依存関係をあまり追加せずに行う方法を探しています。このプロジェクトは DataNucleus を使用し、Maven 3 でビルドされています。
ここに私が見つけたいくつかの指針があります。おそらく、これらのいくつかをすでに試して、どのアプローチが最も効果的かを見つけたかもしれません。
- 書く
Provider<PersistenceManager>
- サーブレットの作成
Filter
- http://www.datanucleus.org/products/datanucleus/jdo/pmf.html
- http://blog.yanivkessler.com/2010/06/lightweight-jdo-persistence-filter.html
- JDO永続マネージャの使用方法は?
- グーグルガイド
現在のソリューションは JPA に基づいており、インジェクションは通常どおり機能します。次のコードは簡略化されており、残念ながら元のコードを投稿できません。
でmain/java/project/ws/rs/TestResource.java
:
@Path("/test")
@Stateless
public class TestResource {
@PersistenceContext(unitName = "project-webapi")
private EntityManager em;
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response test(@PathParam("id") UUID id) {
return Response.status(
Response.Status.OK).entity(em.find(type, id)).build();
}
}
上記でわかるように、永続的な JAX-RS リソースには@Stateless
EJB のアノテーションが付けられています。
すべての Java EE と Jersey の依存関係は、私のターゲット プラットフォームである GlassFish 4.0 によって提供されます。DataNucleus ライブラリは、.NET の実行時にデプロイ可能な war アーティファクトに含まれていますWEB-INF/lib
。
プロジェクトには、main/resources/META-INF/persistence.xml
ファイルによって記述された標準の持続性ユニットがあります。
<persistence>
<persistence-unit name="project-webapi"/>
</persistence>
(簡単にするために、XML 名前空間とスキーマ参照は省略されています。)
デプロイメント記述子は次の場所にありmain/webapp/WEB-INF/web.xml
ます。
<web-app version="3.0" metadata-complete="false" />
目標
上記のようなクリーンな依存性注入を失うことなく、JPA から JDO に切り替えたいと考えています。もちろん、理想的な解決策は上記の を単に置き換えることと似てEntityManager
いPersistenceManager
ますが、それを達成するにはどうすればよいですか、それとももっと良い方法がありますか? この目的のために他の方法がより効率的であれば、注入である必要はありません。
私が切り替える理由は、DataNucleus の助けを借りて非 SQL 永続性も使用できるようにし、完全な ORM 実装を Java EE Web アプリケーションで利用できるようにするためです。
これに興味を持ってくれる人は他にもたくさんいると思います。何か案は?
編集: 上記のような Web アプリが a への参照を取得する最も効率的な方法を見つけることPersistenceManager
が、この質問のポイントです。
JPAでは、インジェクションによって行われます。Java EE 仕様とアプリケーション サーバーが JDO でこれを直接サポートしていないことは明らかです。そうでなければ、私たちはこれを求めません。そのため、私たちは、Web アプリに対して最もクリーンで「最も展開しやすい」方法を追求しています。