2015-07-17 2 views
10

У кого-нибудь есть обходной путь для этой проблемы: https://hibernate.atlassian.net/browse/HHH-9663?JPA удаление сирот не работает для отношений OneToOne

У меня также есть аналогичная проблема. Когда я создал одностороннюю (без обратной ссылки) отношения один к одному между двумя объектами и установил атрибут удаления сироты в значение true, ссылочный объект все еще находится в базе данных после установки ссылки на нуль.

Вот пример модель предметной области:

@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; 
    ... 
} 

Сейчас я работаю вокруг этого вручную удаления сирот.

ответ

9

Cascading имеет смысл только для entity state transitions, которые распространяются от Родителя к ребенку. В вашем случае родитель фактически был ребенком этой ассоциации (с FK).

Попробуйте с этим отображением вместо:

@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; 
    ... 
} 

И каскадное удаление сироту, теперь нужно:

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

Я попробовал это, и она работает, как вы описали, но по какой-то причине моего ленивая загрузка перестала работать. Я посмотрел на сгенерированный запрос, и я вижу два вызова выбора, которые происходят один для получения родительского и другого для дочернего элемента и родителя. Есть идеи? – ankurvsoni

+0

Два выбора означает, что LAZY работает. Вы можете подключиться к FETCH с помощью запроса HQL/JPQL. –

+0

Я имел в виду, когда я делаю что-то вроде: Parent result = repository.findOne (parent.getId()). Я вижу два выбора. Я думал только тогда, когда я делаю что-то вроде: result.getChild() - я бы увидел второй выбор. Разве это не правильное предположение? – ankurvsoni