Grails GORM域类关系

Grails GORM域类关系,grails,dns,gorm,eager-loading,eager,Grails,Dns,Gorm,Eager Loading,Eager,Grails1.1.1 古维1.5.7 在这种关系中: 作者1--n本书n--1出版商 在Grails中定义: class Author { String firstName String lastName static hasMany = [books: Book] static constraints = { books(nullable: true) } } class Book { String ti

Grails1.1.1 古维1.5.7

在这种关系中:

作者1--n本书n--1出版商

在Grails中定义:

class Author {        
  String firstName
  String lastName

  static hasMany = [books: Book]       

  static constraints = {
      books(nullable: true)
  }
}

class Book {        
  String title
  Author author
  Publisher publisher

  static constraints = {
    author(nullable: true)
    publisher(nullable: true)
  }
}

class Publisher {

  String name

  static hasMany = [books: Book]

  static constraints = {
      books(nullable: true)
  }
}
我想载入一本具有出版商和作者价值观的书。 当我得到一本带有查询的书时:

def book2 = Book.findAllByAuthor(author)
我得到了autor Associated的响应,但发布者在另一个查询中只有id和name类:

def book3 = Book.findAllByPublisher(publisher)
我检索到相反的结果,我有一本带有出版商数据的书,但作者只有id和类名

定义模型中的错误在哪里?o执行查询的方式中是否存在错误

编辑:

我需要的方法是仅通过以下查询检索值:

def book2 = Book.findAllByAuthor(author, [fetch:[publisher:'eager']])
在这本书中,我可以管理publisher的价值

问题:如果出版商有一个
拥有许多相关的
,那么我能读懂这本书的属性吗

谢谢。
谢谢。

默认情况下,gorm关联使用延迟抓取。如果要启用即时抓取,可以通过向Author域类添加以下映射块来修改ORM DSL:

static mapping = {
    books lazy:false
}
或者,您可以在定义books关系后,通过添加以下代码来更改域对象中的获取模式

static fetchMode = [books:"eager"]
对您的Publisher域对象执行相同的操作将允许您完成所需的任务。您确实希望小心这样的后果,即您可能会加载比预期更多的数据。

get()方法不应该返回您要查找的数据吗?
示例:def book2=Book.get(author)

您最好使用条件并明确定义应该加载哪些关系。只需在查询中提到关系

例如:

def c = Teacher.createCriteria()

List<Teacher> results = c.list {
            subjects {
                attendees {}
            }
        }
def c=Teacher.createCriteria()
列表结果=c.List{
科目{
与会者{}
}
}

谢谢。但我对问题的另一面很感兴趣,因为你在说:你确实想小心这样做的后果:你可能会加载比你预期更多的数据。-o执行查询的方式中是否存在错误?我找到了一个解决方案,将参数
fetch
添加到quey:-def book2=Book.findAllByAuthor(author[fetch:[publisher:'eager']])中,我也得到了发布者。如果出版商有任何其他需要检索的实体,我该怎么办?添加和添加参数。谢谢。如果您没有定义Publisher使用“急切获取”模式引用的其他对象,那么就我所知,您将不得不对该对象进行迭代。我不想反复迭代,这是我的问题。访问DDBB的次数太多。如果我发现了什么,我会把它贴在这里。感谢您的时间和快速的好答案。Grails1.1.1捆绑了Groovy1.6.3($Grails_HOME/lib/Groovy-all-1.6.3.jar),除非您更换了这个jar,否则Grails1.1.1将使用Groovy1.6.3。没什么大不了的,但值得一提:-)格式不好:
def book2=Book.get(author)
这样:
def book2=Book.findByAuthor(author)
我只从书和作者域获得数据,而不是从出版商那里获得的数据。