Spring JPA не может сохранить элемент коллекции со связанным существующим объектом - отделенный объект передан для сохранения - PullRequest
0 голосов
/ 28 мая 2020

У меня возникла проблема при попытке сохранить элемент коллекции, и одно из его свойств уже является постоянным объектом в базе данных.

Попытка прояснить этот упрощенный пример:

  • Класс A имеет список класса B (One to Many, mappedBy, CascadeType.PERSIST, CascadeType.MERGE)
  • Класс B связан с A (Many to One, JoinColumn)
  • Класс B наследуется от BParent (Single Table)
  • BParent связан с классом C (Many to One, CascadeType.MERGE, CascadeType.PERSIST)

Когда я запускаю ARepository.save (entity) передает ему полный объект (со списком B, включающим один объект B с новым C связанным), он обычно сохраняет все объекты.

Когда я запускаю ARepository.save (entity ) передача объекта, связанного с существующим (со списком B, включающим объект B, созданный с СУЩЕСТВУЮЩИМ C связанным, то есть только с идентификатором), он запускает отсоединенный объект, переданный для сохранения ошибки.

 org.hibernate.PersistentObjectException: detached entity passed to persist: C

What im tr Необходимо сохранить новый связанный объект (если у него нет идентификатора) или связать его с существующим объектом (если у него есть идентификатор).

Все мои репозитории - это интерфейсы Spring Data JpaRepository. Мой код выглядит так (геттеры и сеттеры опущены):

@Entity
public class A {
    @OneToMany(mappedBy = "bEntity", cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
    private List<B> bList = new ArrayList<>();
}

@Entity
@DiscriminatorValue("B")
public class B extends BParent {
    @ManyToOne
    @JoinColumn(name = "CVLE_CVL_UUID")
    private A bEntity;
}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CVLE_TIPO")
@Table( name = "TAB_CONTA_VINCULADA_LANC_EMPREGADO")
public abstract class BParent {
    @Id
    private UUID id;

    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    @JoinColumn(name = "CVLE_EMP_UUID")
    private C cEntity;  
}

@Entity
@Table( name = "TAB_EMPREGADO")
public class C {

    @Id
    @Column(name = "EMP_UUID")
    private UUID id;

}

Надеюсь, я смог объяснить это правильно (английский sh не мой родной язык). Я был бы признателен, если бы кто-нибудь помог мне в этом, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...