2010-08-30 19 views
6

Tôi đang sử dụng JPA + Hibernate với cơ sở dữ liệu PostGre SQL trong dự án J2SE.
Tôi có 2 thực thể AB. A có mối quan hệ @OneToMany với B.
Trong mô hình miền của tôi A có thể tham chiếu đến hàng triệu B của. Khi tôi thêm một đối tượng mới vào bộ sưu tập, sẽ mất vài phút để hoàn thành.JPA + Hibernate (J2SE) @OneToMany - Hàng triệu hồ sơ làm chậm thêm một đối tượng mới xuống

@OneToMany(cascade=CascadeType.PERSIST) 
Collection<B> foo = new ArrayList<B>(); // might contain millions of records 
//... 
// this takes a lot of time 
foo.add(new B()); 

Tôi nghĩ rằng JPA sẽ tìm nạp toàn bộ bộ sưu tập trước khi chèn đối tượng mới. Có khả năng định cấu hình mối quan hệ sao cho bằng cách thêm đối tượng mới vào bộ sưu tập không có thao tác tìm nạp nào được thực hiện?

Trả lời

3

@OneToMany mối quan hệ được tải chậm khi sử dụng JPA. Điều đó có nghĩa là mọi lệnh gọi tới foo sẽ dẫn đến việc JPA tải tất cả các mục được tham chiếu trong cơ sở dữ liệu.

Cách duy nhất tôi biết để tránh điều này là đảo ngược mối quan hệ của bạn và xác định mối quan hệ @ManyToOne trên B (chỉ đến A). Bằng cách này, bạn không có một bộ sưu tập cần phải được nạp để chèn một đối tượng mới vào cơ sở dữ liệu của bạn.

Đây là một mẫu mã:

public class B { 

    @ManyToOne 
    private A a; 

    public void foo() { 
     A a = new A(); 
     B b = new B(); 
     b.setA(a); // Instead of a.getFoo().add(b); 
     // Persist b in database... 
    } 

} 
1

Sử dụng truy cập tài sản thay vì

@OneToMany(cascade=CascadeType.PERSIST) 
public Collection<B> getFoo() { 
    return foo; 
} 

triển khai JPA tận dụng proxy. Nhưng nó chỉ hoạt động khi sử dụng chiến lược truy cập thuộc tính

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