как сохранить объект с существующими детьми? - PullRequest
0 голосов
/ 14 октября 2019

У меня есть два класса. «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").

1 Ответ

0 голосов
/ 14 октября 2019

методы persiste в JPA и их спецификация обновят объекты, если они существуют в db, поэтому, когда вы сохраните classB, объект classA будет обновлен, если нет изменений, они останутся прежними

...