2015-03-23 3 views

Antwort

2

Es ist einfach. Angenommen, Sie haben das folgende Domänenmodell haben:

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

Wenn Sie die folgende HQL-Abfrage ausführen:

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

dann für jede Anmerkung Sie eine zusätzliche Abfrage zum Abrufen des dazugehörigen Kommentars Beitrags werden müssen laufen .

Wenn Sie 2nd-Level-Caching aktivieren:

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

Dann zunächst auf der 2. Ebene Cache geht Hibernate die Entität zu laden und trifft nur auf die Datenbank, wenn kein Cache ist gefunden Eintrag.

Eine einfachere Lösung ist einfach fetch all required data at query-time:

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

diese Weise werden Sie nicht in N + 1 Abfrage Probleme laufen, und Sie werden nicht einen 2nd Level Cache entweder benötigen. Like any caching solution ist der Cache der zweiten Ebene anfällig für Inkonsistenzen, wenn die Datenbank außerhalb der Hibernate-API aktualisiert wird.

Verwandte Themen