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

}

Это мой метод обновления

@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

2 ответа

Решение

У меня был столбец версии, который не был установлен, когда начальные данные были вставлены в базу данных. Отсюда все проблемы с обновлением и удалением

Слияние обновит строку, ТОЛЬКО ЕСЛИ он найдет идентификатор в базе данных, поэтому, если вы создадите новый объект и забыли установить его идентификатор на тот же идентификатор нужной строки, он попытается вставить новый. Если в вашей таблице базы данных нет уникального поля, вероятно, эта вставка будет успешной, так как не будет ошибки sql.

Я смог обновить нужную строку, как только установил новый объект с идентификатором этой строки.

Другие вопросы по тегам