2015-03-23 12 views

Trả lời

2

Thật đơn giản. Hãy nói rằng bạn có mô hình miền sau:

@Entity(name = "Post") 
public class Post { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String name; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "post") 
    private List<Comment> comments = new ArrayList<>(); 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<Comment> getComments() { 
     return comments; 
    } 

    public void addComment(Comment comment) { 
     comments.add(comment); 
     comment.setPost(this); 
    } 
} 

@Entity(name = "Comment") 
public class Comment { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @ManyToOne 
    private Post post; 

    public Comment() { 
    } 

    public Comment(String review) { 
     this.review = review; 
    } 

    private String review; 

    public Long getId() { 
     return id; 
    } 

    public Post getPost() { 
     return post; 
    } 

    public void setPost(Post post) { 
     this.post = post; 
    } 

    public void setReview(String review) { 
     this.review = review; 
    } 
} 

Nếu bạn chạy các truy vấn HQL sau:

List<Comment> comments = session.createQuery(
    "select c from Comment c ").list(); 
for(Comment comment : comments) { 
    Post post = comment.getPost(); 
} 

Sau đó cho từng Bình luận bạn sẽ phải chạy một truy vấn bổ sung cho lấy các liên Đăng nhận xét .

Nếu bạn kích hoạt bộ nhớ đệm cấp 2:

@Entity(name = "Post") 
@Cacheable 
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class Post { 
    ... 
} 

Sau đó Hibernate đầu tiên đi đến cấp độ bộ nhớ cache thứ 2 để nạp các thực thể và chỉ số truy cập cơ sở dữ liệu nếu không có cache entry được tìm thấy.

Một giải pháp đơn giản hơn là chỉ đơn giản là fetch all required data at query-time:

List<Comment> comments = session.createQuery(
    "select c from Comment c fetch c.post ").list(); 

Bằng cách này bạn sẽ không chạy vào N + 1 vấn đề truy vấn, và bạn sẽ không cần một bộ nhớ cache cấp 2 hoặc. Like any caching solution, bộ nhớ cache cấp 2 dễ bị mâu thuẫn khi cơ sở dữ liệu được cập nhật bên ngoài API Hibernate.

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