2011-02-24 74 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