2012-10-17 71 views
6

我遇到了使用EntityManager將元素持久化到數據庫的問題。根據我找到的答案,我在DaoJpa嘗試了這4種方式來做這樣的事情,但仍然失敗。在這裏,我附了四種方法我試過:EntityManager不能使用persist將元素保存到數據庫中

代碼在控制器部分:

@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上進行交易nager - 使用Spring 交易或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(); 

例外,我得到: 的應用程序必須提供JDBC連接

有人能幫助我弄清楚請問問題?提前謝謝了!

非常感謝JustinKSU的幫助。我在Spring上下文中添加註釋,然後解決! 這裏是我的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

你有沒有試過在持久化方法上使用@Transactional? – JustinKSU

+0

對不起,我忘了在帖子中提到它。是的,我在所有四種方法之前在方法之前添加了@Transactional。此外,我嘗試在事務性註釋之後添加(readOnly = true)/(readOnly = false),甚至還添加了(propagation = Propagation.REQUIRED),但似乎沒有區別。 –

+0

你使用@PersistenceContext來注入entityManager嗎? – JustinKSU

回答

9

要在Spring上下文使@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

嘗試刪除默認模式下的模式參數=「代理」 – JustinKSU

+0

哇謝謝你@JustinKSU我現在解決了這個問題!這正是註釋的問題!也許我應該附上我的春天的內容,以幫助其他可能遇到類似問題的人。無論如何,非常感謝您的幫助! –

1

如果你仍然有這個問題,所有的配置都OK,請確保@Transaction註釋的方法是公共的,不受保護以便由事務管理器識別/管理。

+0

根據OP的帖子中的代碼片段,所有的方法都是' public'。另外它指出,當添加''解決了這個問題。我沒有看到你的回答在討論中添加任何內容。 – bhantol

+2

也許這個答案可以幫助其他開發者?! – Criss

相關問題