У меня есть два класса. «ClassA» имеет список «ClassB». Когда я сохраню «ClassA», я хочу сохранить со списком существующих ClassB, которые уже были сохранены в другой системе.
Я попытался установить некоторые параметры каскада, и результат такой же,Если я добавлю каскадный тип ALL, hibernate попытается вставить объекты ClassB, а это не ожидаемое поведение.
Я использую Spring Data JPA, и мои классы настроены следующим образом:
@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
.
.
.
}
Когда я пытаюсь сохранить 'ClassA', я получаю ошибку
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
ошибка возникает после того, как hibernate пытается вставить данные в таблицу отношений ("CLASSA_CLASSB"), сопоставленную с аннотацией @JoinTable.
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").