Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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

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_Jpa - Fatal编程技术网

Java 为什么非级联实体中的级联实体在保存操作中保持不变?

Java 为什么非级联实体中的级联实体在保存操作中保持不变?,java,hibernate,jpa,Java,Hibernate,Jpa,很长一段时间以来,我一直在断断续续地使用Hibernate。今天我经历了一些我无法解释的事情。我保存了一个没有级联到相关实体的实体。相关的非级联实体与一些新的/未级联的实体有关系,虽然它们的实体模型在持久化后没有更新,但它们被保存到数据库中 以下是正在发挥作用的实体的要点: 一个计划有1个以上的步骤,而一个步骤恰好属于一个计划 计划有0多个日志事件 一个步骤有0多个日志事件 日志事件具有关联的步骤或计划,但不是两者都有 计划及其步骤之间没有级联 Cascade=ALL for plan=>日志

很长一段时间以来,我一直在断断续续地使用Hibernate。今天我经历了一些我无法解释的事情。我保存了一个没有级联到相关实体的实体。相关的非级联实体与一些新的/未级联的实体有关系,虽然它们的实体模型在持久化后没有更新,但它们被保存到数据库中

以下是正在发挥作用的实体的要点:

  • 一个计划有1个以上的步骤,而一个步骤恰好属于一个计划
  • 计划有0多个日志事件
  • 一个步骤有0多个日志事件
  • 日志事件具有关联的步骤或计划,但不是两者都有
  • 计划及其步骤之间没有级联
  • Cascade=ALL for plan=>日志
  • Cascade=ALL for step=>日志
  • 没有为计划=>步骤指定级联

当@Transactional服务调用planRepository.save(plan)时,我希望会保存对计划及其相关日志的更新,但不会保存对步骤及其日志的任何更改。然而,我观察到的是,该步骤新创建的日志被保存。步骤已经存在;我不确定这是否是一个重要的细节。所有日志都是新的

如果我使用EntityManager创建一个“from Log”查询,它将为我提供步骤的持久化日志。但是,如果我将计划返回给调用方法(在本例中是控制器),或者直接从Hibernate获取计划,步骤的日志没有主键,而计划的日志有主键(这是我所期望的)


我很惊讶Hibernate正在保存步骤的日志。到底是什么巫毒?这是可配置的吗?

我不明白。您修改了一个持久实体,为什么不保存更改?计划与步骤之间没有级联,但步骤与日志之间有级联。当我保存计划时,它会保存步骤的日志,即使没有级联?此外,即使保存了日志,也不会填充它们的ID。如果我添加级联,就会填充ID,这就是我所期望的。在调用时,该步骤将被持久化,但日志不会被持久化。如果没有级联,我不希望在保存计划时日志被持久化。让我重复一下:对持久化实体的更改总是被保存的。
计划步骤是否包含持久实体?您是否对该集合中的对象进行了更改?不,这种行为是不可配置的,让我重复一下:从计划到步骤没有级联,但从步骤到日志有级联。当我保存计划时,它会保存步骤的日志,即使没有级联?此外,即使保存了日志,也不会填充它们的ID。如果我添加级联,就会填充ID,这就是我所期望的。在调用时,该步骤将被持久化,但日志不会被持久化。如果没有层叠,我不希望在保存计划时保存日志,因为步骤已经存在;我不确定这是否是一个重要的细节。“是的,这是一个关键的细节。
步骤是持久性实体,这意味着您对它们所做的任何更改都将由Hibernate跟踪,并在事务结束时持久化。通过调用
em.find()
、查询或通过将它们与另一个实体关联而获得对它们的访问权并不重要。如果对持久实体进行更改,这些更改将被保存