2012-01-06 8 views
3

私のプロジェクトではSeam 3を使用しています。に@Injectアノテーションを挿入する際に問題があります。 EnityManagerがどのPersistenceUnitを使用するかを知るための設定があります。 EJBとたとえば次のように入力します。Seamで@Inject EntityManagerを実行できるようにするためのコンフィグレーション3

た永続ユニット
@PersistenceContext(unitName="MY_PERSISTENCE_UNIT_NAME") 
private EntityManager eManager; 

persistence.xmlファイルに設定されています。追加することによって、私はシーム2に関するいくつかの記事を読んだことがあるが、設定はcomponents.xmlファイルであっ作られ

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="MY_PERSISTENCE_UNIT_NAME" transaction-type="JTA"> 

     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:jboss/TimeReportDS</jta-data-source> 
     <mapping-file>META-INF/orm.xml</mapping-file> 

     <class>....</class> 
     <class>....</class> 
     <class>....</class> 

     <properties> 

      <property name="jboss.entity.manager.factory.jndi.name" 
       value="java:/modelEntityManagerFactory" /> 

      <!-- PostgreSQL Configuration File --> 
      <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /> 
      <property name="hibernate.connection.password" value="password" /> 
      <property name="hibernate.connection.url" value="jdbc:postgresql://192.168.2.125:5432/t_report" /> 
      <property name="hibernate.connection.username" value="username" /> 

      <!-- Specifying DB Driver, providing hibernate cfg lookup 
       and providing transaction manager configuration --> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
      <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/> 
      <property name="hibernate.transaction.manager_lookup_class" 
       value="org.hibernate.transaction.JBossTransactionManagerLookup" /> 
      <property name="hibernate.archive.autodetection" value="class" /> 

      <!-- Useful configuration during development - developer can see structured SQL queries --> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.format_sql" value="false" /> 

     </properties> 
    </persistence-unit> 
</persistence> 

<components>タグ内

<persistence:managed-persistence-context 
     name="entityManager" auto-create="true" persistence-unit-jndi-name="java:/modelEntityManagerFactory" /> 

ここに私の擬似的な構成です。シーム2の次のステップは、追加することです:persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence ...> 
    <persistence-unit name="MY_PERSISTENCE_UNIT_NAME" ...> 
     ... 
     <properties> 
      ... 

      <property name="jboss.entity.manager.factory.jndi.name" 
       value="java:/modelEntityManagerFactory" /> 

     </properties> 
    </persistence-unit> 
</persistence> 

<property name="jboss.entity.manager.factory.jndi.name" 
       value="java:/modelEntityManagerFactory" /> 

が、それはシーム3に何のファイルcomponents.xmlがないことを縫い目。また、永続性ユニットを指定するためのという属性は@Injectアノテーションにありません。

私のプロジェクトを設定して、@InjectEntityManagerをネット上の多くの例に示すように使用してください。

私はPostgresデータベースとJBoss AS 7を使用します。

EDIT:例を追加します。 EntityクラスのEntityManagerは使用しません。この@Injectでここ

@Named("validateReportAction") 
@SessionScoped 
public class ValidateReportAction extends ReportAction implements Serializable { 

    private static final long serialVersionUID = -2456544897212149335L; 

    @Inject 
    private EntityManager em; 
... 
} 

私はEntity@Injectが正常に動作としてマークされているいくつかの豆に@Injectを使用している場合、私はEclipseNo bean is eligible for injection to the injection point [JSR-299 §5.2.1]

から警告を受けます。

+0

あなたはどんな問題を抱えていますか?同じpersistence.xml内に複数の永続性ユニットがある場合は、アノテーションに識別子を使用する必要があります。それはデフォルトのものだけを持っているからです。 persistence.xmlがDAOクラスとEntityクラスと同じモジュール(JAR)にあることを確認してください。 – Perception

+0

@Perception私が編集した投稿を見て、弁別者の例を教えてください。 – nyxz

+0

Maistora - discriminator注釈は必要ありません。persistence.xmlには1つのPUしかありません。しかし、あなたが追加したエラーメッセージに基づいて、私はEclipseがJBoss JEE実装ファイルを見つけられないと確信しています。 Mavenを使用している場合は、POMにjboss-javaee-web-6.0依存関係を追加する必要があります。他のビルドツールを使用している場合、JARを見つけて手動でプロジェクトクラスパスに追加する必要があります。 – Perception

答えて

5

@PersistenceContextは、CDI Beanで使用できます。 EJBである必要はありません。

何らかの理由で@Injectを使用したい場合は、より多くの作業を行う必要があります。 @InjectはEntityManagerについて知りません。他のマネージドBeanのみをインジェクトすることができます。幸いなことに、単純な回避策があります - 単純なトランポリンとして機能するプロデューサメソッドを使用します。

@ApplicationScoped 
public class EntityManagerProducer { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @Produces 
    @RequestScoped 
    public EntityManager getEntityManager { 
     return entityManager; 
    } 

    public void closeEntityManager(@Disposes EntityManager em) { 
     if (em != null && em.getTransaction().isActive()) { 
      em.getTransaction().rollback(); 
     } 
     if (em != null && em.isOpen()) { 
      em.close(); 
     } 
    } 

} 

@Injectを使用してEntityManagerを挿入できるようになりました。挿入されたEntityManagerはRequestScopedになり、EntityManagerProducerはApplicationScopedになります。さらに、entityManagerを閉じる必要があります。

+0

これはとてもうれしいです:)ありがとう、しかし、私はentityManager.persist(MyObject)を使用すると、このエラーが表示されます:javax.persistence.TransactionRequiredException:この操作を実行するトランザクションが必要です(トランザクションまたは拡張永続コンテキストを使用) – nyxz

+0

そこで、PersistenceContext(type = PersistenceContextType.EXTENDED)を追加しましたが、何も起こりませんでした。私は、これは自分自身で取引を気にする必要があることを意味すると私は読んでいます。トランザクションを管理するコンテナを作成する方法はありますか? – nyxz

+1

恐れはありません。 EJBはトランザクションを取得します。 CDI beansはそうではありません。 Seamはおそらくこれを手助けする何かを持っていますが、Seamについてはあまりよく分かりません。単純なEEでは、トランザクションを自分で管理する必要があります。 (a)BeanのUserTransactionを介して明示的にトランザクションを管理する、(b)フィルタを追加してトランザクション内のリクエスト・サイクル全体をラップする、(c)トランザクションを管理するCDIインターセプタを作成する(http:// smokeandice .blogspot.com/2009/12/cdi-and-declarative-transactions.html - これは本当にクールだ!)。 –

関連する問題