2011-03-20 26 views
24

Mi entityManager persist() obtiene el id de la secuencia y lo coloca en mi objeto Image pero el objeto Image no se muestra en la base de datos. EntityManager.flush() da un error por lo que no puedo cometer de esta manera. Aquí está mi código.EntityManager persist() no guarda nada en la base de datos

@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

qué versión de JPA/resorte está utilizando? – Premraj

+0

Spring 3.05 @Falcon – ivar

+0

Estoy interesado en la versión de JPA ... Deshazte de JpaTemplate ... no resolverá tu problema, pero será bueno – Premraj

Respuesta

26

Esto generalmente ocurre cuando no se aplica Transacción .. Dudo que el interceptor @Transactional no esté interceptando correctamente.

+0

Una cosa más para comprobar: Asegúrese, la anotación '@ Transactional' es del paquete' org.springframework.transaction.annotation', no 'javax.transaction' - la segunda no funcionaba en mi caso. – Gondy

24

persisten() significa "añadir objeto a la lista de entradas gestionadas". Para guardar el objeto en la base de datos debe llamar al método flush(). Pero recuerde que debe llamar dentro de la transacción.

// Editar: Ejemplo de método de guardar.

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(); 
} 

Esto no es lo mejor que puedes hacer, pero es lo suficientemente bueno.

+7

flush() se llama antes de una confirmación en ambos sentidos. – bestsss

+0

Se agregó entityManager.flush() y se obtuvo javax.persistence.TransactionRequiredException: no hay ninguna transacción en progreso – ivar

+0

Ivar look edition –

0

Compruebe su mvc-dispatcher-servlet.xml. Aquí, en <context:component-scan base-package="pass"/>, el pase debe ser igual al paquete donde sus controladores son

Cuestiones relacionadas