当前位置: 首页 > 面试题库 >

JPA Hibernate合并执行插入而不是更新

松灿
2023-03-14
问题内容

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

@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的事务


问题答案:

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



 类似资料:
  • 嗨,我是Spring Data JPA的新手,我想知道即使我将Id传递给实体,Spring data jpa也是插入而不是合并的。我想当我实现持久接口并实现这两个方法时: 它将自动合并而不是持久化。 我有一个名为User like的实体类: 再上一节课 我有一个名为UserRepostory的自定义存储库,它扩展了JpaReopistory。当我看到实现演示SpringDataJpa使用以上两种方

  • Object.assign和Object spread仅进行浅合并。 问题的一个例子: 输出是您所期望的。但是,如果我尝试以下方法: 而不是 你得到 X被完全覆盖,因为扩展语法只深入一层。这与相同。 有办法做到这一点吗?

  • 我有一个模型 视图定位对象: 然后它会做出一些改变(或者可能不会) 然后它尝试保存任何更改: 这里是Django尝试插入另一行而不是更新的地方,导致了一个DB错误 解决方案中有一种类似的问题: 一旦我将primary_key字段设置为自动字段,问题就消失了。 但是,我的主键已经是一个自动字段。 所以我用调试器逐步浏览了django代码,并在文件中资助了这个: 似乎如果没有更改(因此更新不做任何事情

  • 问题内容: 编辑。在扩展基本存储库类并添加insert方法的同时,一个更优雅的解决方案似乎是在实体中实现Persistable。查看 可能的解决方案2 我正在使用Hibernate作为ORM 创建服务。 遵循本教程的基础。 http://www.petrikainulainen.net/spring-data-jpa- tutorial/ 我的实体存储库扩展 我正在使用使用有意义的主键而不是自动生

  • Spring Boot 2.4.0,DB是MySql 8。 使用REST每15秒从远程获取数据并使用将其存储到MySql DB。 它为所有给定的实体调用save()方法。 所有数据都设置了ID。 我希望如果DB中没有这样的id-它将被插入。 如果这样的ID已经在DB中呈现-它将被更新。 这里是从控制台剪下的: 下面是获取和保存的方法,如下所示: 此方法每15秒运行一次。 实体: 和存储库: 这是以

  • 问题内容: 我要查询所有10个表以从中获取用户ID,并将所有用户ID加载到HashSet中,以便可以拥有唯一的用户ID。 截至目前,它是按顺序进行的。我们转到一个表,并从中提取所有user_id并将其加载到哈希集中,然后将其存储在第二个和第三个表中并继续运行。 有什么方法可以使这个多线程的,以便他们为每个表并行地从我的表中获取数据?最后,我需要哈希集,该哈希集应具有所有10个表中的所有唯一用户ID