0

Java EE 6 アプリにそのようなマネージド Bean があります。

@Named
@RequestScoped
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class RegistrationBean implements Serializable {

    @PersistenceContext
    EntityManager em;

    public String doRegistration() {
        MyEntity entity = new MyEntity();
        em.persist(entity);
        return "view";
    }
}

@TransactionAttribute を理解している限り、新しいトランザクションは自動的に作成されるはずです。しかし、例外が発生しているため、明らかにそうではありません。javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction

私の持続性ユニットにはtransaction-type="JTA"属性があります。JBoss 6 cr1 を使用しています。

4

4 に答える 4

5

あなたがやろうとしていることは正確ではありません。定義したのはプレーンな CDI Bean であり、@TransactionAttribute アノテーションをネイティブにサポートしていません。このアノテーションは、@Stateless アノテーションを使用して取得する EJB Bean で使用するためのものです。

この場合、必ずしも TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) アノテーションを使用する必要はないことに注意してください。デフォルトでは、Bean に @Stateless でアノテーションを付けると、すでに TransactionAttributeType.REQUIRES を取得しています。ほとんどの場合、これが必要です。

于 2010-11-28T00:54:18.703 に答える
1

@TransactionAttribute は EJB アノテーションです。EJB コンテナのように CDI コンテナがトランザクション管理を提供するとは思えません。

あなたの場合の1つの解決策は、データベースアクセス機能をステートレスEJBに入れ、それをRegistrationBeanに注入することです。そうは言っても、自動トランザクション処理を取得するために TransactionAttributeType.REQUIRES_NEW を指定する必要はありません。別のトランザクションを実行しているメソッドから EJB メソッドを呼び出す予定がなく、呼び出されたメソッドを元のトランザクションとは別のトランザクションで実行する場合を除き、暗黙的なデフォルトの REQUIRES で十分です。

于 2010-11-28T00:46:12.907 に答える
1

デフォルトでは、CDI はコンテナ管理のトランザクションをサポートしていません。ただし、Seam 3 Persistence モジュールを使用すると、アプリケーションに CMT サポートを追加できます。

Seam Persistence のドキュメントはこちら -->リンク

まず、Seam Persistence jar をプロジェクトに追加します。

<dependency>
  <groupId>org.jboss.seam.persistence</groupId>
  <artifactId>seam-persistence-api</artifactId>
  <version>${seam.persistence.version}</version>
</dependency>

<dependency>
  <groupId>org.jboss.seam.persistence</groupId>
  <artifactId>seam-persistence-impl</artifactId>
  <version>${seam.persistence.version}</version>
</dependency>

<dependency>
  <groupId>org.jboss.seam.solder</groupId>
  <artifactId>seam-solder</artifactId>
  <version>${seam.solder.version}</version>
</dependency>

次に、beans.xmlで宣言型トランザクション管理を有効にします。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee 
      http://docs.jboss.org/cdi/beans_1_0.xsd">

   <interceptors>
      <class>org.jboss.seam.persistence.transaction.TransactionInterceptor</class>
   </interceptors>
</beans>

ドキュメントによると、EJB の場合と同様にマネージド Bean で @TransactionAttribute アノテーションを使用できるはずですが、それを機能させることができませんでした。ただし、代わりに、クラスまたはメソッドで@Transactionalアノテーションを使用できます。これは Seam Persistence と同等であり、正常に動作します。

お役に立てれば。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2011-01-24T19:45:10.317 に答える