질문의 첫 번째 줄에 lazy
대신에 eager
이 기본값이라고 생각합니다.
포인트가
이 협회는 기준 쿼리에 포함 할 때 기억해야 할, 그들은 기본적 열심히 페치에 의해입니다.
귀하의 경우 books lazy:false
을 Author
에 매핑 할 필요가 없습니다. 나는 아래의 접근을 보증 할 최적화의 측면에서
: 나는 20000 개 블로그를 쓴 한 각 저자가 있다면 내가 하지 위의 접근 방식으로 갈 것 성능면에서
class Author {
String name
static hasMany = [books: Book]
static mapping = {
//books lazy:false (DO NOT NEED)
}
}
class Book {
String bookName
//set belongsTo if you need bi-directional one-many
//books gets cascade deleted when author is deleted
//static belongsTo = [author: Author]
}
//Bootstrap
def author1 = new Author(name: "Dan Brown")
def book1 = new Book(bookName: "Da Vinci Code")
def book2 = new Book(bookName: "Angels And Demons")
def book3 = new Book(bookName: "Inferno")
[book1, book2, book3].each {author1.addToBooks(it)}
author1.save(flush: true, failOnError: true)
//Criteria
Author.createCriteria().list{
eq("name", "Dan Brown")
books{
//books are eagerly fetched by default using inner join. No need to specify FetchMode.
}
}
(책을 대체 블로그와 함께). 20000 개의 블로그를 n
명의 작성자를 대상으로 열심히 가져 오는 것은 실적이 좋습니다. 이 경우에는 게으른 가져 오기 (N + 1) 경로를 찾아 내 요구 사항에 따라 블로그를 필터링하려고합니다. 아래처럼 뭔가 : 당신이 그런 (블로그 케이스) 케이스가없는 경우
def author = Author.findByName("Dan Brown")
def books = author.books
//Assume you have a field publishedYear in Book
def booksReleasedIn2013 = author.books.findAll{it.publishedYear == 2013}
def booksReleasedBefore2013 = author.books.findAll{it.publishedYear < 2013}
assert "Inferno" in booksReleasedIn2013*.bookName
assert "Angels And Demons" in booksReleasedBefore2013*.bookName
, 그때 최적화 및 성능 모두 위의 인용 된 예를 사용합니다.