当前位置: 首页 > 知识库问答 >
问题:

org.hibernate.TransitientObjectException使用CascadeType.All持久化嵌套子级

齐昆
2023-03-14

我有一个名为human的类,它有一个狗的列表:

@Entity
public class Human {

    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}, orphanRemoval = true)
    private Set<Dog> dogs = new HashSet<>(List.of(new Dog()));

    ...
}

狗类dog有一个小狗列表:

@Entity
public class Dog {

    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true)
    private Set<Puppy> puppies = new HashSet<>(List.of(new Puppy()));
}

@Entity
public class Puppy {

    @Id
    @GeneratedValue
    private Long id;
}

当我试图创建一个新的人类,它有一只狗,狗又有一只小狗,并且我使用带有spring的Hibernate JPA存储库来保存人类时:

Human human = new Human();
Set<Dog> dogs = new HashSet<>();
Dog dog = new Dog();
dog.setPuppies(new HashSet<>(List.of(new Puppy())));
dogs.add(dog);
human.setDogs(dogs);
humanRepository.save(human);

我得到以下错误:

org.hibernate.transitientObjectException:对象引用了未保存的瞬态实例-在刷新之前保存瞬态实例:com.test.puppy

但是,如果我用默认值创建人类,并用人类存储库保存他,它就能工作,并且保存了小狗。

Human human = new Human();
humanRepository.save(human);

我不明白为什么小狗没有自动保存,我也不想使用一个单独的存储库来保存小狗。当狗定义cascadetype.all时,Hibernate不应该自动保存我的小狗吗?就像他们在这个stackoverflow上说的:JPA Hibernate级联类型for child of child

共有1个答案

丁英韶
2023-03-14

尝试将级联类型更改为在关联批注中持久化

@OneTomany(fetch=FetchType.Eager,cascade={CascadeType.Persist},OlphanRemovation=true)

 类似资料:
  • 我有一个简单的JPA存储库,看起来如下所示: 和两个有一个单子映射的类,如下所示: . 现在,我知道我可以很容易地编辑和持久化一个像这样的用户实例: 但是,在没有指向实例的指针的上下文中,如何持久化实例,f.I.: 我可以只调用吗? 我是否需要自动连接另一个存储库()并在其上调用.save()?

  • 我确实有两个实体,称为学校和水平,具有多对多的关系。 我的Rest controller有一个create方法,它接受一个SchoolDTO(目前它的结构与实体相同)。 当我试图通过JPARepository保存方法保存时,会抛出一个包含以下消息的异常: 通过遍历每个级别Id来解决这个问题...使用JPA存储库方法(它调用)获取引用,然后加载正确的模型,然后成功持久化。 我的问题是:这是在Spri

  • Akka持久化使有状态的actor能留存其内部状态,以便在因JVM崩溃、监管者引起,或在集群中迁移导致的actor启动、重启时恢复它。Akka持久化背后的关键概念是持久化的只是一个actor的内部状态的的变化,而不是直接持久化其当前状态 (除了可选的快照)。这些更改永远只能被附加到存储,没什么是可变的,这使得高事务处理率和高效复制成为可能。有状态actor通过重放保存的变化来恢复,从而使它们可以重

  • 我遇到了一个问题,在我的JPA表中没有任何内容被持久化。据我所知,我想我理解了的基本思想。我猜出现问题的原因是,我在一个可嵌入的对象中有一个。 一个简单的例子: 有什么线索表明可能出了什么问题吗? 为了简洁起见,我将尽量使附加信息尽可能简短。 创建计算原因 创建计算历史记录 调试信息在计算历史#创建 HibernateDAO仓库 Hibernate生成的SQL 看起来HiberNate甚至没有生成

  • 我有一个实体,它已经持久化,并希望将其添加到新生成的父实体(尚未持久化)。如果我尝试持久化父级,我会得到错误“分离的实体传递到持久化:model.child”。我想我必须以某种方式为孩子调用“EntityManager.merge()”,而不是“EntityManager.persisted()”。但是我没有显式调用persisted。这由“cascade=cascadetype.all”注释处理

  • Spark通过在操作中将其持久保存在内存中,提供了一种处理数据集的便捷方式。在持久化RDD的同时,每个节点都存储它在内存中计算的任何分区。也可以在该数据集的其他任务中重用它们。 我们可以使用或方法来标记要保留的RDD。Spark的缓存是容错的。在任何情况下,如果RDD的分区丢失,它将使用最初创建它的转换自动重新计算。 存在可用于存储持久RDD的不同存储级别。通过将对象(Scala,Java,Pyt