2011-03-20 116 views
24

我的entityManager persist()從序列獲取id並將其放到我的Image對象中,但Image對象本身沒有顯示在數據庫中。 EntityManager.flush()給出一個錯誤,所以我不能以這種方式提交。這是我的代碼。EntityManager persist()不保存任何東西到數據庫

@Repository 
public class ImageDaoImpl extends BaseDao implements ImageDao { 

@PersistenceContext 
protected EntityManager entityManager; 

@Override 
@Transactional 
public void create(Image image) {  
    JpaTemplate jpaTemplate = getJpaTemplate(entityManager); 
    jpaTemplate.persist(image); 
} 

 

@Repository 
public class BaseDao { 

private JpaTemplate jpaTemplate; 


public JpaTemplate getJpaTemplate(EntityManager entityManager){ 
    if(jpaTemplate == null) 
     jpaTemplate = new JpaTemplate(entityManager); 
    return jpaTemplate; 
} 

 

<bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
     p:dataSource-ref="dataSource"> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="showSql" value="true" /> 
       <property name="generateDdl" value="true" /> 
       <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" /> 
      </bean> 
     </property> 
     <property name="persistenceUnitName" value="sample"></property> 
    </bean> 



    <!-- DataSource Setup --> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.postgresql.Driver" /> 
     <property name="url" value="jdbc:postgresql://localhost:5432/imageCapture" /> 
     <property name="username" value="myusername" /> 
     <property name="password" value="mypassword" /> 
    </bean> 


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

    <tx:annotation-driven transaction-manager="transactionManager" /> 
+0

你正在使用哪個JPA/spring版本? – Premraj 2011-03-20 19:17:10

+0

Spring 3.05 @Falcon – ivar 2011-03-20 19:35:28

+0

我對JPA版本感興趣..擺脫JpaTemplate ..不會解決你的問題,但會很好 – Premraj 2011-03-20 20:06:32

回答

26

這通常發生在事務沒有應用..我懷疑@Transactional攔截器是不是正確截取。

+0

還有一件事要檢查:確保'@ Transactional'註釋來自'org.springframework.transaction.annotation'包,而不是'javax.transaction' - 第二個不適用於我的情況。 – Gondy 2016-12-15 13:55:08

24

堅持()的意思是 「添加對象管理條目列表」。爲了將對象保存到數據庫中,您必須調用flush()方法。但是請記住,您必須在交易中致電。

//編輯: 保存方法示例。

public void save(T t){ 
    // begin transaction 
    em.getTransaction().begin(); 
    if (!em.contains(t)) { 
     // persist object - add to entity manager 
     em.persist(t); 
     // flush em - save to DB 
     em.flush(); 
    } 
    // commit transaction at all 
    em.getTransaction().commit(); 
} 

這不是你可以做的最好的,但足夠好。

+7

flush()在提交之前調用任一方式。 – bestsss 2011-03-20 19:23:59

+0

添加了entityManager.flush()並得到了javax.persistence.TransactionRequiredException:沒有事務正在進行中 – ivar 2011-03-20 19:38:05

+0

Ivar看版本 – 2011-03-20 20:09:32

0

檢查您的mvc-dispatcher-servlet.xml。這裏<context:component-scan base-package="pass"/>通過應該等於你的控制器所在的包是

相關問題