2011-02-24 17 views
15

私はオブジェクトを更新しようとしていますが、マージは更新の代わりに挿入を実行しているようです。JPA Hibernateマージは更新の代わりに挿入を実行します

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

}

これは、私は次のエラーがJPAトランザクションをコミットできませんでした取得私の更新方法

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


に更新されます。入れ子にされた例外はjavax.persistence.RollbackExceptionです:rollbackOnlyとしてマークされたトランザクション

+0

どのように挿入を実行すると判断しますか? – axtavt

+0

**本当に** REQUIRES_NEW **の伝播が好きではありません。あなたはTXでエンティティを作成してから別のTXで「マージまたはアップデート」を行っているかもしれませんが、オリジナルについてはわかりませんエンティティ。 – Augusto

+0

私はログをチェックして、挿入をしようとします – user373201

答えて

22

データベースにシードデータが挿入されたときに設定されていないバージョンの列がありました。したがって、更新と削除のすべての問題

+0

のコードを更新しました。私は同じ問題に出会いました。:) –

+0

ありがとうございましたuser373201、私はこれに苦労していました。バージョンを変更するとすぐに、考えていた。ありがとう。 – Richipal

+0

バージョン列、どちらも、同じ問題を抱えていますが、データベースのすべての列を設定しましたが、更新の代わりにレコードを挿入しています。 – Mufrah

関連する問題