2011-02-24 94 views
15

我有一个简单的测试,我试图更新对象,但合并似乎是执行插入而不是更新。JPA休眠合并执行插入而不是更新

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

}

这是我更新的方法

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

更新代码

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


现在我碰到下面的错误不能犯JPA交易;嵌套异常是javax.persistence.RollbackException:标记为rollbackOnly的事务

+0

你如何确定它执行插入? – axtavt 2011-02-24 13:07:35

+0

我不**真的**喜欢** REQUIRES_NEW **传播,您可能会在TX中创建实体,然后在不同的TX中进行“合并或更新”,而不知道原始的实体。 – Augusto 2011-02-24 13:48:17

+0

我检查了日志,它试图做一个插入 – user373201 2011-02-24 15:21:09

回答

22

我有一个版本列,当种子数据插入数据库时​​没有设置。因此,所有更新和删除的问题

+0

以上的代码,做的很好,我遇到了同样的问题.. :) – 2011-05-12 13:01:07

+0

感谢user373201,我一直在为此而苦苦挣扎,并且我遇到了您的建议,只要我更改了版本,它就开始工作了假设。谢谢。 – Richipal 2012-04-24 15:18:44

+0

版本列,哪一个,即时通讯也有同样的问题,我已经设置了数据库的所有列,但它仍然插入记录而不是updates.help – Mufrah 2013-06-10 07:16:14