2015-03-23 10 views

risposta

2

È semplice. Diciamo che avete il seguente modello di dominio:

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

Se si esegue la seguente query HQL:

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

Poi, per ogni commento dovrete eseguire una query aggiuntiva per andare a prendere il commento Invia un associato .

Se si abilita la cache di 2 ° livello:

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

caso Hibernate prima va al 2 ° livello di cache per caricare l'entità e colpisce solo il database se non c'è alcuna voce di cache trovato.

Una soluzione più semplice è quella di semplicemente fetch all required data at query-time:

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

In questo modo non verrà eseguito in N + 1 problemi di query, e non avrete bisogno di una cache di 2 ° livello sia. Like any caching solution, la cache di secondo livello è soggetta a incoerenze quando il database viene aggiornato all'esterno dell'API di Hibernate.