【问题标题】:JPA Hibernate merge performs insert instead of updateJPA Hibernate 合并执行插入而不是更新
【发布时间】:2011-07-03 13:35:27
【问题描述】:

我有一个简单的测试,我试图更新对象,但合并似乎是在执行插入而不是更新。

@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

【问题讨论】:

  • 如何确定它执行插入?
  • 真的不喜欢 REQUIRES_NEW 传播,您可能正在 TX 中创建实体,然后执行“合并或更新”在不同的 TX 中,它不知道原始实体。
  • 我检查了日志并尝试插入
  • 致奥古斯托....这是有道理的。我更改了代码,但现在我将事务标记为仅回滚。我已经更新了上面的代码

标签: hibernate jpa


【解决方案1】:

只有当它在数据库中找到 id 时,Merge 才会更新该行,因此如果您创建一个新对象并忘记将其 ID 设置为所需行的相同 ID,它会尝试插入一个新对象。如果您的数据库表没有任何唯一字段,则此插入可能会成功,因为不会出现 sql 错误。

一旦我使用该行的 ID 设置新对象,我就能够更新所需的行。

【讨论】:

    【解决方案2】:

    当种子数据插入数据库时​​,我有一个没有设置的版本列。因此,更新和删除的所有问题

    【讨论】:

    • 感谢 user373201,我一直在为此苦苦挣扎,我遇到了您的建议,一旦我更改了版本,它就开始按预期工作。谢谢。
    • 版本列,哪一个,我也有同样的问题,我已经设置了数据库的所有列,但它仍然插入记录而不是更新。帮助
    • 我知道这是旧线程,但即使在今天......许多开发人员也面临同样的问题......所以我发帖,这个问题的一个可能原因......programmingforfuture.com/2011/02/…
    • 此答案发布 10 多年后仍然有用。
    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多