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
¿Cómo se determina que realiza la inserción? – axtavt
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
Revisé los registros e intenta hacer una inserción – user373201