2012-10-17 7 views
6

EntityManagerを使用して要素をデータベースに永続化するという問題を満たしました。私が見つけた答えに基づいて、私はDaoJaでこのようなことをする4つの方法を試みましたが、それでも失敗しました。コントローラ部にEntityManagerは要素をデータベースに保存するためにpersistを使用できません

コード:ここで私は、私が試した4つの方法を添付

@Transactional 
    SmartProduct smartProduct = new SmartProduct(); 
      smartProduct.setName("Dove Soap"); 
      smartProductDao.persist(smartProduct); 

1. DaoJpa:

@Transactional 
public void persist(SmartProduct smartProduct) { 
      entityManager.persist(smartProduct); 

は動作しません! 作成を許可されていない:私が得た

2.

@Transactional 
public void persist(SmartProduct smartProduct) { 
entityManager.persist(smartProduct); 
entityManager.flush(); 

例外:私が得た進行中のトランザクションがない

3.

@Transactional 
public void persist(SmartProduct smartProduct) { 
EntityTransaction emTransaction = entityManager.getTransaction(); 
     emTransaction.begin(); 
     entityManager.persist(smartProduct); 
     emTransaction.commit(); 
     entityManager.close(); 

例外共有EntityMaでのトランザクション アプリケーションは、誰かが私が把握助けてもらえJDBC接続

を供給しなければならない: - nager私が得た

代わりに春 トランザクションを使用するか、またはEJB CMT

4.

@Transactional 
public void persist(SmartProduct smartProduct) { 
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit"); 
       EntityManager em = emf.createEntityManager(); 
       EntityTransaction etx = em.getTransaction(); 
       etx.begin(); 
       em.persist(smartProduct); 
       etx.commit(); 
       em.close(); 
       emf.close(); 

例外問題はどうですか?事前に多くの感謝!

感謝JustinKSUの助け。私は春のコンテキストで注釈を追加し、それが解決しました! は、ここに私のSpringコンテキストの以前のバージョンである:

<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" /> 

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
     <property name="persistenceUnitName" value="persistenceUnit" /> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

追加した後

<tx:annotation-driven /> 

それは動作します:あなたが持っている必要があり

<tx:annotation-driven /> 
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

    <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" /> 

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
     <property name="persistenceUnitName" value="persistenceUnit" /> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 
+1

persistメソッドで@Transactionalを使ってみましたか? – JustinKSU

+0

申し訳ありません私はポストでそれを言及するのを忘れてしまった。はい、メソッドの前に@Transactionalを4つの方法で追加しました。また、Transactionalアノテーションの後に(readOnly = true)/(readOnly = false)を追加しようとしましたが、(propagation = Propagation.REQUIRED)も追加しましたが、違いはありません。 –

+0

@PersistenceContextを使用してentityManagerを挿入していますか? – JustinKSU

答えて

9

は、あなたの春のコンテキストで@Transactionalを有効にするには以下:

お使いのバージョンに合ってください:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

注釈を有効にする:

<tx:annotation-driven /> 

はあなたのエンティティマネージャを注入し、あなたのトランザクションマネージャを宣言します。

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 
+0

私の春の文脈での注釈は次のようになっています。 ? –

+3

デフォルトモード= "proxy"で行くモードパラメータを削除してみてください – JustinKSU

+0

ワウありがとうございます@JustinKSU今問題を解決します!注釈の問題です。似たような問題に直面している他の人を助けるために、私は下の春の文脈の内容を添付するべきかもしれません。とにかく、親切に助けてくれてありがとう! –

1

あなたはまだこの問題を持っており、すべての構成に問題がない場合、確認してください@Transaction注釈付きメソッドはパブリックであり、トランザクションマネージャによって識別/管理されるように保護されていないことを示します。

+0

OPの投稿のコードスニペットごとに、すべてのメソッドは ' 「公然」。また、 ' 'を追加すると問題が解決されることも記載されています。あなたの答えは議論に何も追加していません。 – bhantol

+2

この回答は、他の開発者に役立つかもしれません。 – Criss

関連する問題