OrphanRemoval не работает для сирот - PullRequest
0 голосов
/ 22 февраля 2020

Проблема в том, что я не могу удалить объект 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 (эхх ... :))? Примерно так: «неудачное удаление из-за ....»

...