为了账号安全,请及时绑定邮箱和手机立即绑定

在同一事务方法中使用 CriteriaBuilder JPA 插入和更新会出现错误“外键不存在”

在同一事务方法中使用 CriteriaBuilder JPA 插入和更新会出现错误“外键不存在”

jeck猫 2023-05-10 14:08:05
我正在尝试进行插入,并使用生成的实体更新同一事务中的 N 条记录。出现错误“FK 不存在”,观察查询的日志跟踪以触发指令的相反顺序执行。服务:@Transactionalpublic Entity1 createEntity(Entity1 newEntity){    Entity1 inserted = dao.createEntity(newEntity);    Integer numUpdated = dao.updateEntity2(newEntity)    return inserted;}Dao:public Entity1 createEntity(Entity1 newEntity){    this.em.persist(newEntity);    //now newEntity has PK    return newEntity;}public Integer updateEntity2(Entity1 newEntity){    CriteriaBuilder cb = em.getCriteriaBuilder();    CriteriaUpdate<Entity2> uq = cb.createCriteriaUpdate(Entity2.class);    Root<Entity2> rootEntity2 = uq.from(Entity2.class);    uq.set(rootEntity2 .get(Entity2_.entity1), newEntity);    return em.createQuery(uq).executeUpdate();  }实体:@Entitypublic class Entity1 implements Serializable {    [...]    @OneToMany(mappedBy="entity1",fetch=FetchType.LAZY)    private List<Entity2 > entity2s;    [...]}@Entitypublic class Entity2 implements Serializable {    [...]    @ManyToOne(fetch = FetchType.LAZY)    @JoinColumn(name="E1_ID")    private Entity1 entity1;    [...]}这个想法是不必用刷新来关闭事务,因为我知道写下事务性的方法应该允许这样做
查看完整描述

1 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

根据jpa 2.1的api

CriteriaUpdate 接口定义了使用 Criteria API 执行批量更新操作的功能。Criteria API 批量更新操作直接映射到数据库更新操作,绕过任何乐观锁定检查。如果需要,使用批量更新操作的便携式应用程序必须手动更新版本列的值,和/或手动验证版本列的值。 持久性上下文与批量更新的结果不同步。

CriteriaUpdate 对象必须有一个根。

PSD 2.1 火

在某些示例中,他们手动管理事务性,在 catch 子句中使用 em.getTransaction().commit()、em.getTransaction().rollback() 等


查看完整回答
反对 回复 2023-05-10
  • 1 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信