我正在尝试进行插入,并使用生成的实体更新同一事务中的 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() 等
添加回答
举报
0/150
提交
取消