2

私は JTA を初めて使用し、データベースからいくつかの要素を取得する方法が必要です。EntityManager を介してこれを行うことができますが、これは ResourceLocal に対してのみ機能します。これを行う方法を知りたい:

Query q = em.createNamedQuery("AnyQuery");
q.getResultList();

EntityManager を使用せずに。何か案は?

4

1 に答える 1

5

質問自体は、使用しようとしているテクノロジーをまったく理解していないことを示しています。実際の開発を行う前に、おそらくもう少し一般的なことを学ぶ必要があります。

  • おそらくJTAとJPAを混同しているでしょう。
  • RESOURCE_LOCALに関するあなたの声明は真実ではありません(そして無関係です)-JTAおよびRESOURCE_LOCALトランザクションがあり、Java EEでは通常前者を使用します。
  • EntityManager なしで名前付き JPA クエリを使用するというあなたの考えはまったくばかげており、おそらく何らかの誤解から生じています (エンティティ マネージャーなしで名前付きクエリを使用するポイントは何でしょうか?)、
  • 「データベースからのいくつかの要素」と言うと、レコードとマップされたオブジェクトの違いを実際には見分けられないことがわかります。その場合、おそらく JPA をまったく使用しないでください。

あなたがこの答えを受け入れるとは思っていません。それは私の欲求不満が引き継いでいるだけです。

編集

OK、あなたが JSF に言及したので、私はあなたの問題をより理解しました。

JPAを使いたいと思います。このような場合、次の選択肢があります。

  • 独自の EntityManager を作成する (そのような場合、それを注入することはできません。代わりに、EntityManagerFactory を使用して独自に構築する必要があります)。これは「アプリケーション管理の EntityManager」です。あなたは本当にこれをしたくありません。
  • 注入された EntityManaged (「コンテナ管理の EntityManager」) を使用します。これが標準的な選択です。

次に、トランザクションが必要です。JTA EntityManager を使用する必要があるため、全体の調整を担当するトランザクション オブジェクトが必要になります。ここでも、次の 2 つの選択肢があります。

  • JSF Bean で、UserTransaction を注入します (@Resource アノテーションを使用)。これは面倒で、エラーが発生しやすく、多くのボイラープレートを必要としますが、必要なすべてのメソッドを見つけることができます。独自の (アプリケーション管理の) EntityManager を作成し、その joinTransaction メソッドを呼び出してから、UserTransaction で begin-commit を呼び出すことができます。これは「アプリケーション管理トランザクション」になります。
  • EntityManager コードを EJB に移動します。数行のコードと 1 つの注釈 (@Statless) だけで済みます。EJB 内のすべてのコードは、コンテナーが管理するトランザクション内に (魔法のように) ラップされます。これは「コンテナ管理トランザクション」であり、デフォルトで一般的な選択です。

上記のそれぞれは、いくつかの追加情報で拡張できます (また拡張する必要があります)。ただし、短いパスは次のとおりです。

  • EJB (@Stateless アノテーションを持つ単純なクラス) を作成し、
  • EntityManager を使用するメソッドを EJB に移動し、
  • マネージド Bean に EJB を注入し (@EJB アノテーションを使用)、関連するメソッドを呼び出します。

JTA トランザクションは、任意の EJB メソッドへの呼び出しごとに発生します。これで始められるはずです:-)

于 2013-03-16T22:40:34.280 に答える