猿问

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

我正在尝试进行插入,并使用生成的实体更新同一事务中的 N 条记录。


出现错误“FK 不存在”,观察查询的日志跟踪以触发指令的相反顺序执行。


服务:


@Transactional

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

}

实体:


@Entity

public class Entity1 implements Serializable {

    [...]

    @OneToMany(mappedBy="entity1",fetch=FetchType.LAZY)

    private List<Entity2 > entity2s;

    [...]

}


@Entity

public class Entity2 implements Serializable {

    [...]

    @ManyToOne(fetch = FetchType.LAZY)

    @JoinColumn(name="E1_ID")

    private Entity1 entity1;

    [...]

}

这个想法是不必用刷新来关闭事务,因为我知道写下事务性的方法应该允许这样做


jeck猫
浏览 176回答 1
1回答

喵喵时光机

根据jpa 2.1的apiCriteriaUpdate 接口定义了使用 Criteria API 执行批量更新操作的功能。Criteria API 批量更新操作直接映射到数据库更新操作,绕过任何乐观锁定检查。如果需要,使用批量更新操作的便携式应用程序必须手动更新版本列的值,和/或手动验证版本列的值。 持久性上下文与批量更新的结果不同步。CriteriaUpdate 对象必须有一个根。PSD 2.1 火在某些示例中,他们手动管理事务性,在 catch 子句中使用 em.getTransaction().commit()、em.getTransaction().rollback() 等
随时随地看视频慕课网APP

相关分类

Java
我要回答