Java 如何保存具有现有子对象的对象?
我有两门课“ClassA”有一个“ClassB”列表。当我准备好时,我将保存我想要保存的'ClassA',以及一个已经由另一个系统保存的现有ClassB的列表 我尝试了一些级联选项,结果是一样的。如果我放置cascade类型,那么hibernate会尝试插入ClassB的对象,而这不是预期的行为 我使用的是Spring数据JPA,我的类配置如下:Java 如何保存具有现有子对象的对象?,java,hibernate,spring-boot,spring-data-jpa,Java,Hibernate,Spring Boot,Spring Data Jpa,我有两门课“ClassA”有一个“ClassB”列表。当我准备好时,我将保存我想要保存的'ClassA',以及一个已经由另一个系统保存的现有ClassB的列表 我尝试了一些级联选项,结果是一样的。如果我放置cascade类型,那么hibernate会尝试插入ClassB的对象,而这不是预期的行为 我使用的是Spring数据JPA,我的类配置如下: @Table(name = "ClassA", schema = "SCHEMA1") public void ClassA { @ManyToM
@Table(name = "ClassA", schema = "SCHEMA1")
public void ClassA {
@ManyToMany
@JoinTable(name = "CLASSA_CLASSB", schema="SCHEMA1" joinColumns = @JoinColumn(name = "SEQ_CLASSA"), inverseJoinColumns = @JoinColumn(name = "SEQ_CLASSB"))
list<ClassB> chilsAlreadySaved;
.
.
.
}
@Table(name="ClassB", schema = "SCHEMA2")
public void ClassB {
//HAS NO MAPPING FOR ClassA
.
.
.
}
在hibernate尝试在@JoinTable注释上映射的关系表(“CLASSA_CLASSB”)上插入数据后,会发生此错误
insert
into
schema1.classA
(attibutes ...)
values
(?, ?, ?, ?, ? ...)
Hibernate:
insert
into
schema1.CLASSA_CLASSB
(seq_classA, seq_classB)
values
(?, ?)
org.springframework.dao.InvalidDataAccessApiUsageException:
org.hibernate.TransientObjectException: object references an unsaved transient
instance - save the transient instance before flushing: ClassB; nested exception is java.lang.IllegalStateException:
org.hibernate.TransientObjectException: object references an unsaved transient
instance - save the transient instance before flushing: ClassB
.
.
.
因此,目标是持久化“ClassA”类型的对象,而不对“ClassB”类型的对象进行更改。唯一允许的更改是对“ClassA”对象表的插入和对关系表的插入(“ClassA_CLASSB”) JPA上的persiste方法和there规范将更新db中存在的对象,因此,当您将持久化classB时,classA的对象将被更新,如果没有更改,它们将保持不变如何检索ClassB的对象?我从rest API收到一个ClassA的JSON,其中包含一个ClassB列表。我不想保存“ObjectB”的新实例,我想保存一个“ObjectA”的新实例和一个现有的“ObjectB”列表。
insert
into
schema1.classA
(attibutes ...)
values
(?, ?, ?, ?, ? ...)
Hibernate:
insert
into
schema1.CLASSA_CLASSB
(seq_classA, seq_classB)
values
(?, ?)
org.springframework.dao.InvalidDataAccessApiUsageException:
org.hibernate.TransientObjectException: object references an unsaved transient
instance - save the transient instance before flushing: ClassB; nested exception is java.lang.IllegalStateException:
org.hibernate.TransientObjectException: object references an unsaved transient
instance - save the transient instance before flushing: ClassB
.
.
.