2011-02-24 9 views
15

Tengo una prueba simple, en la que intento actualizar el objeto, pero la combinación parece estar realizando una inserción en lugar de una actualización.La fusión de Hibernate de JPA realiza una inserción en lugar de la actualización

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:spring/app-context.xml","classpath:spring/testdb-context.xml"}) 
public class UserJPATest { 
@Test 
public void testUpdate() throws Exception { 
    System.out.println("update"); 

    User entity = ObjectManager.USER_DAO.findById(3L); 
    entity.setUsername("harryUpdate"); 

    ObjectManager.USER_DAO.update(entity); 

    User selEntity = ObjectManager.USER_DAO.findById(3L); 
    Assert.assertEquals(entity.getUsername(),selEntity.getUsername()); 
} 

}

Este es mi método de actualización

@Override 
@Transactional(propagation= Propagation.REQUIRES_NEW) 
public T update(T entity) throws Exception { 
    try { 
     T merged = entityManager.merge(entity); 
     return merged; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new Exception(e); 
    } 
} 

actualización de código

@Override 
@Transactional(propagation= Propagation.REQUIRES_NEW) 
public T update(T entity) throws Exception { 
    try { 
     T merged = null; 
     BaseEntity baseEntity = null; 
     if(entity instanceof BaseEntity){ 
      baseEntity = (BaseEntity)entity; 
      merged = entityManager.find(entityClass, baseEntity.getId()); 
     } 
     merged = entityManager.merge(entity); 
     entityManager.flush(); 
     return merged; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new Exception(e); 
    } 
} 


Ahora me sale el siguiente error No se pudo confirmar la transacción APP; la excepción anidada es javax.persistence.RollbackException: transacción marcada como rollbackOnly

+0

¿Cómo se determina que realiza la inserción? – axtavt

+0

No ** realmente ** me gusta la propagación ** REQUIRES_NEW **, puede que esté creando la entidad en una TX y luego haciendo una "combinación o actualización" en una TX diferente, que no sabe acerca de la original entidad. – Augusto

+0

Revisé los registros e intenta hacer una inserción – user373201

Respuesta

22

Tenía una columna de versión que no se configuró cuando los datos de inicialización se insertaron en la base de datos. De ahí todos los problemas con la actualización y eliminar

+0

bien hecho, me encontré con el mismo problema ... :) –

+0

Gracias user373201, he estado luchando con esto y me encontré con su sugerencia, tan pronto como cambié la versión, comenzó a funcionar como lo se suponía que Gracias. – Richipal

+0

columna de versión ,, cuál, también estoy teniendo el mismo problema, he configurado todas las columnas de la base de datos, pero sigue insertando el registro en lugar de la actualización.ayuda – Mufrah

Cuestiones relacionadas