Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式关闭乐观锁定_Java_Hibernate - Fatal编程技术网

Java 以编程方式关闭乐观锁定

Java 以编程方式关闭乐观锁定,java,hibernate,Java,Hibernate,我有一些代码将fixture添加到数据库中,以供测试使用。但是,有子对象的锁定实体存在一些问题,因为它们保存了两次(一次是在保存子对象时,另一次是在保存父对象时)。这将产生乐观锁定错误,因为版本字段始终为空 有没有一种方法可以通过编程关闭乐观锁定?显然,我需要在之后再次打开它以正确运行测试 我正在使用以下方法保存: @PersistenceContext(unitName = "pu") private EntityManager em; @Override public <T exte

我有一些代码将fixture添加到数据库中,以供测试使用。但是,有子对象的锁定实体存在一些问题,因为它们保存了两次(一次是在保存子对象时,另一次是在保存父对象时)。这将产生乐观锁定错误,因为版本字段始终为空

有没有一种方法可以通过编程关闭乐观锁定?显然,我需要在之后再次打开它以正确运行测试

我正在使用以下方法保存:

@PersistenceContext(unitName = "pu")
private EntityManager em;

@Override
public <T extends Entity> T save(T e) {
    return em.merge(e);
}
@PersistenceContext(unitName=“pu”)
私人实体管理者;
@凌驾
公共T保存(T e){
返回em.merge(e);
}
背景


想法如下,我有一个测试数据集,可以有这样的结构:一个类a,它与一个子B有一个必需的双边关系。所以我有一个objs a1和a2,它们都引用同一个子b1。我在枚举中保存此obj的引用,以便在测试中使用它们而无需获取(例如,我可以查询屏幕并检查检索到的名称==a1.name)。但我还需要将它们插入数据库。所以我迭代所有装置,保存它们。它们都设置了自己的id,以保证唯一性(例如,a1和a2将具有相同的子级)。当我保存a1时,它通过级联保存b1。它需要这样做,因为关系是必需的,否则我会得到一个约束冲突。但是,当我保存a2时,它会尝试更新b1,,这很好,因为它们是相同的,,但我会被锁定,因为我的optVersion为空。碰巧我也保存了b1,因为我不知道谁是谁的孩子,这使得一切都错了。我不想将optVersion dur更新为性能。我也不想再保存一次,但这对我来说似乎是不可能的——除非我可以通过编程将所有级联设置为创建但不更新或其他什么(尽管这似乎更难)。

“它们保存了两次”嗯,可能和锁定无关,但与代码逻辑有关。所以,当您保存子级(独立)时它被持久化并将版本增加到1。在此之后,您有一个父级,该父级与它的子级(已持久化)进行级联?所以父母没有最新的孩子。我理解正确吗?如果是这样,请更新您的家长以了解其子女的最新情况。如果我错过了,请提供更多细节。“关闭/打开”乐观锁不是一个健壮的解决方案。我不认为它不健壮,因为它只在测试环境中。用我正在做的细节更新了问题。