2015-07-17 15 views
10

Czy ktoś ma obejście tego problemu: https://hibernate.atlassian.net/browse/HHH-9663?Usuwanie plików osieroconych JPA nie działa w przypadku relacji OneToOne

Mam podobny problem. Kiedy utworzyłem jednostronną (bez wstecznego odniesienia) relację jeden do jednego między dwoma obiektami i ustawiono atrybut usuwania osieroconego na true, obiekt referencyjny jest nadal w bazie danych po ustawieniu odniesienia na wartość null.

Oto przykładowy model domeny:

@Entity 
public class Parent { 
    ... 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinColumn(name = "child_id") 
    private Child child; 
    ... 
} 

@Entity 
public class Child { 
    ... 
    @Lob 
    private byte[] data; 
    ... 
} 

Obecnie pracuję obejść poprzez ręczne usuwanie sierot.

Odpowiedz

9

Cascading ma sens tylko dla entity state transitions propagowane z Dominującej do dziecka. W twoim przypadku rodzic był w rzeczywistości dzieckiem tego związku (posiadającym FK).

Spróbuj z tym mapowaniem Zamiast:

@Entity 
public class Parent { 
    ... 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent") 
    private Child child; 
    ... 
} 

@Entity 
public class Child { 

    @OneToOne 
    @JoinColumn(name = "parent_id") 
    private Parent parent; 

    ... 
    @Lob 
    private byte[] data; 
    ... 
} 

I kaskada usunięcie sierocy, teraz trzeba:

Parent parent = ...; 
parent.getChild().setParent(null); 
parent.setChild(null); 
+1

Próbowałem to i to działa jak opisano, ale z jakiegoś powodu mój Leniwe ładowanie przestało działać. Spojrzałem na wygenerowane zapytanie i widziałem dwie wybrane rozmowy, które miały miejsce w celu uzyskania rodzica, a inne - w połączeniu z rodzicem. Jakieś pomysły? – ankurvsoni

+0

Dwa zaznaczenia oznaczają, że LAZY działa. Możesz POŁĄCZYĆ FETCH za pomocą zapytania HQL/JPQL. –

+0

Miałem na myśli, gdy robię coś w stylu - Parent result = repository.findOne (parent.getId()). Widzę dwa selekcje. Myślałem tylko wtedy, gdy robię coś takiego: result.getChild() - zobaczyłbym drugi wybór. Czy to nie jest właściwe założenie? – ankurvsoni

Powiązane problemy