我有一個簡單的測試,我試圖更新對象,但合併似乎是執行插入而不是更新。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的事務
你如何確定它執行插入? – axtavt 2011-02-24 13:07:35
我不**真的**喜歡** REQUIRES_NEW **傳播,您可能會在TX中創建實體,然後在不同的TX中進行「合併或更新」,而不知道原始的實體。 – Augusto 2011-02-24 13:48:17
我檢查了日誌,它試圖做一個插入 – user373201 2011-02-24 15:21:09