私はオブジェクトを更新しようとしていますが、マージは更新の代わりに挿入を実行しているようです。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としてマークされたトランザクション
どのように挿入を実行すると判断しますか? – axtavt
**本当に** REQUIRES_NEW **の伝播が好きではありません。あなたはTXでエンティティを作成してから別のTXで「マージまたはアップデート」を行っているかもしれませんが、オリジナルについてはわかりませんエンティティ。 – Augusto
私はログをチェックして、挿入をしようとします – user373201