2015-07-17 14 views
10

Có ai có giải pháp cho sự cố này không: https://hibernate.atlassian.net/browse/HHH-9663?Loại bỏ trẻ mồ côi JPA không hoạt động đối với quan hệ OneToOne

Tôi cũng đang gặp phải sự cố tương tự. Khi tôi tạo một mặt (không có tham chiếu ngược) một mối quan hệ giữa hai thực thể và đặt thuộc tính loại bỏ mồ côi thành true, đối tượng được tham chiếu vẫn nằm trong cơ sở dữ liệu sau khi đặt tham chiếu thành null.

Đây là mẫu mô hình miền:

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

Tôi hiện đang làm việc này bằng cách trẻ mồ côi tự xóa.

Trả lời

9

Cascading chỉ có ý nghĩa cho entity state transitions rằng tuyên truyền từ một Chánh đến một Child. Trong trường hợp của bạn, cha mẹ thực sự là con của hiệp hội này (có FK).

Hãy thử với bản đồ này để thay thế:

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

Và để thác việc loại bỏ mồ côi, bây giờ bạn cần phải:

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

tôi đã cố gắng này và nó đang làm việc như bạn mô tả, nhưng vì một lý do của tôi tải chậm đã ngừng hoạt động ngay bây giờ. Tôi nhìn vào truy vấn được tạo ra và tôi có thể thấy hai cuộc gọi chọn xảy ra một để nhận cha mẹ và người khác cho trẻ em và cha mẹ tham gia. Bất kỳ ý tưởng? – ankurvsoni

+0

Hai lựa chọn có nghĩa là LAZY hoạt động. Bạn có thể JOIN FETCH bằng truy vấn HQL/JPQL. –

+0

Tôi có nghĩa là khi tôi làm một cái gì đó như - Parent result = repository.findOne (parent.getId()). Tôi thấy hai lựa chọn. Tôi đã nghĩ chỉ khi tôi làm một cái gì đó như: result.getChild() - Tôi sẽ thấy lựa chọn thứ hai. Đó không phải là một giả định đúng? – ankurvsoni

Các vấn đề liên quan