È 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.
fonte
2015-03-23 22:42:30