Grails GORM Domain类关系

时间:2009-12-03 10:30:12

标签: grails dns gorm eager-loading eager

Grails 1.1.1 Goovy 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)
  }
}

我想加载一本包含Publisher和Author值的Book。 当我拿到一本带有查询的书时:

def book2 = Book.findAllByAuthor(author)

我得到了autor assosiated的响应,但发布者在其他查询中只有id和name类:

def book3 = Book.findAllByPublisher(publisher)

我检索了反向结果,我的书上有发布者数据,但作者只有id和类名。

定义模型中的错误在哪里? o查询的方式有误?

编辑:

我需要使用这样的查询检索值的方法:

def book2 = Book.findAllByAuthor(author, [fetch:[publisher:'eager']])

在这个中我可以管理出版商的价值。

问题:如果发布商与hasmanyDomain相关,那么获取该书我能够阅读这些属性吗?

感谢。 感谢。

3 个答案:

答案 0 :(得分:1)

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

static mapping = {
    books lazy:false
}

或者您可以在定义图书关系后添加以下代码来更改域对象中的获取模式。

static fetchMode = [books:"eager"]

对Publisher域对象执行相同操作应该可以让您完成所需的操作。您确实需要注意可能加载的数据超出预期的后果。

答案 1 :(得分:0)

get()方法不应该返回您要查找的内容吗? 示例:def book2 = Book.get(作者)

答案 2 :(得分:0)

您最好使用Criteria并明确定义应该急切加载哪些关系。只需在查询中提及关系。

示例:

def c = Teacher.createCriteria()

List<Teacher> results = c.list {
            subjects {
                attendees {}
            }
        }