Проблема в том, что я не могу удалить объект oprhan, используя Spring JpaRepository с hibernate 5.4.
У нас есть класс с именем A, в котором есть список соединений, который содержит два экземпляра As, чтобы связать их. (Извините, если код содержит ошибку компиляции, я изменил оригинал в блокноте)
public class A {
@Id
private Long id;
@OneToMany(mappedBy = "a1", fetch = FetchType.LAZY, cascade = ALL, orphanRemoval = true)
private List<B> listOfB1 = new ArrayList<>();
@OneToMany(mappedBy = "a2", fetch = FetchType.LAZY, cascade = ALL, orphanRemoval = true)
private List<B> listOfB2 = new ArrayList<>();
}
public class B {
@Id
private Long id;
@ManyToOne
@JoinColumn(name = "A1_ID")
private A a1;
@ManyToOne
@JoinColumn(name = "A2_ID")
private A a2;
private TypeOfRelation typeOfRelation;
}
1. Мы создаем два As, связываем их вместе и сохраняем:
A a1= new A();
A a2=new A();
a1= repo.save(a1);
a2= repo.save(a2);
B b1 = new B(a1,a2);
B b2 = new B(a1,a2);
a1.getlistOfB1().add(b1);
a1.getlistOfB1().add(b2);
a2.getlistOfB2().add(b1);
a2.getlistOfB2().add(b2);
//save again
2 Снова извлекая a1 из БД, он содержит все отношения. Затем удалите одно из B
A loadedA = findByName(a1);
B1 b1 = loadedA.listOfB1().get(0);
b1.getA2.getlistOfB2().remove(b1);
loadedA.getListOfB1().remove(b1);
//after this point nothing references b1
//saving loadedA...
Все отношения все еще существуют в БД.
Однако, если я загружаю А2 в точке 2. примерно так:
A loadedA = findByName(a2);
B1 b1 = loadedA.listOfB2().get(0);
b1.getA1.getlistOfB1().remove(b1);
loadedA.getListOfB2().remove(b1);
//after this point nothing references b1
saving loadedA...
Он работает как заклинание и удаляет потерянную сущность.
Журнал Hibernate на уровне трассировки показывает тот же журнал. у обоих есть эта запись:
Deleting orphaned entity instance: com.package.B
Разве это не означает, что удаление должно быть инициировано?
Единственное различие, когда удаление не сработало:
a,this line appears: ID unsaved-value strategy UNDEFINED
b,and no SQL delete statement shows up for B
Вкл. В довершение всего, у меня есть другая иерархия сущностей с точно такой же структурой, с тем же использованием хранилища (было вставлено при копировании), и это работает снова во всех случаях.
Это сводит меня с ума.
(Примечание: всякий раз, когда я хочу удалить B вручную (вызывая удаление из репозитория B - после удаления ссылок, разумеется), он этого не делает.)
Есть ли способ заставить hibernate печатать более подробный журнал чем TRACE (эхх ... :))? Примерно так: «неудачное удаление из-за ....»