У меня есть простой тест, где я пытаюсь обновить объект, но слияние, похоже, выполняет вставку вместо обновления.JPA Hibernate merge выполняет вставку вместо обновления
@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
Я не ** действительно ** люблю ** REQUIRES_NEW ** распространение, вы можете создать объект в TX, а затем выполнить «слияние или обновление» в другом TX, который не знает об исходном организация. – Augusto
Я проверил журналы и попытался сделать вставку – user373201