2012-02-09 6 views
1

私はJava EE 6の新機能です。私は、EclipseLink JPA EntityManagerをインジェクトしようとしています。これを実現するさまざまな方法を模索しています。私はGlassfishとDerbyを使用しています。以下の例では、簡潔にするためにEntityManagerを直接サーブレットまたはコントローラに挿入しようとしていますが、実際にはEntityManagerをラップするDAOクラスがあります。次のように SpringとJava EEの両方を使用してJPA EntityManagerを挿入する

は、Java EE 6において、Iは、サーブレットを定義することができる:

@WebServlet(urlPatterns="/app/*") 
public class FrontController extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    @PersistenceContext 
    private EntityManager entityManager; 
} 

のEntityManagerが正しくないさらなる構成で注入されます。

ここでは、理想的にはアノテーションを使用して、Springを使いたいと思います。現在、次のように私はコントローラを定義することができます。

@Controller 
@RequestMapping("/testurl.htm") 
public class ExampleController { 
    private EntityManager em; 

    @PersistenceContext 
    public void setEntityManager(EntityManager em) { 
     this.em = em; 
    } 
} 

春が正しく物事を配線するためには、私は自分のアプリケーションコンテキストxmlファイルに次のディレクティブを含める必要があります。

<bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="myPU"/> 
</bean> 

場合私は展開上の例外を取得し、上記のスニペットが含まれていません。 org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 0

は私が上記のXMLスニペットを必要としない印象の下にあったthisを読みました。上記のスニペットが常に必要とされるかどうか誰にでも確認できますか?

Java EEコンテナによってEntityManagerがFrontControllerサーブレットに正常に挿入された場合、この同じEntityManagerをSpringアプリケーションコンテキストに挿入して他のSpring Beanで利用できるようになる方法はありますか?

+2

あなた、サービス層にあなたのemをしませ注入コントローラ – NimChimpsky

答えて

0

あなたのemをあなたのコントローラではなくサービス層に注入します。

(hibernate4を使用して)簡単なスニペット:

​​

とサービス:

@Service("companyService") 
@Transactional 
public class CompanyService { 

    @Resource(name = "sessionFactory") 
    private SessionFactory sessionFactory; 

    @Transactional(readOnly = true) 
    public List<Company> getAllCompanies() { 
    final Session session = sessionFactory.getCurrentSession(); 
//... do stuff 
} 

とアプリのコンテキストの該当ビット

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
     p:dataSource-ref="dataSource" p:configLocation="WEB-INF/classes/hibernate.cfg.xml" 
     p:packagesToScan="com.mypackage" /> 

    <!-- Declare a datasource that has pooling capabilities --> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
     ... /> 

    <!-- Declare a transaction manager --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
       p:sessionFactory-ref="sessionFactory" /> 
+0

ありがとう、これは私が後になったものではありません(私が言ったように、私は一度注射作業をDAOを使用することを目指していますs)。私が投稿した[link](http://static.springsource.org/spring/docs/2.5.x/reference/orm.html#orm-jpa-straight)では、彼らの 'ProductDaoImpl'にはSpringの依存関係はありません。それらのアプリコンテキストxmlには、デフォルトの(JEEコンテナによって提供された)エンティティマネージャファクトリが使用されていることを示唆する、任意のエンティティマネージャ宣言もありません。 – zorgbargle

+0

@ zorgbargle a daoはサービスクラス/レイヤーとは異なります。サービスレイヤーにdaoを挿入し、コントローラーに挿入します。これは現在2.5バレル、最大3.1バレルです。 – NimChimpsky

+0

ありがとう、私は彼らが異なっていることを認識していますが、私はここでやろうとしていることを変えるとは思えません。私がサービス層を導入すると、Springがサービス層を構築しようとしたときと同じ例外が発生します。編集:申し訳ありません - あなたの2番目のレスポンスしか見ていません - 私はAOPのやり方を変えるか分かりません。[spring-noob!] – zorgbargle

関連する問題