【问题标题】:Grails GORM Domain class relationshipGrails GORM 域类关系
【发布时间】:2010-12-22 18:46:03
【问题描述】:

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)

我得到了与作者关联的响应,但发布者在另一个查询中只有 id 和 name 类:

def book3 = Book.findAllByPublisher(publisher)

我检索到相反的结果,我有带有出版商数据的书,但作者只有 id 和类名。

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

编辑:

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

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

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

问题:如果出版商有一个hasmany 或Domain 相关,得到我能够阅读的属性的书?

谢谢。 谢谢。

【问题讨论】:

  • Grails 1.1.1 捆绑了 Groovy 1.6.3 ($GRAILS_HOME/lib/groovy-all-1.6.3.jar),除非您替换了那个 jar,否则 Grails 1.1.1 将使用 Groovy 1.6。 3.没什么大不了的,但值得评论:-)

标签: grails dns grails-orm eager-loading eager


【解决方案1】:

默认情况下,延迟获取与 gorm 关联一起使用。如果您想启用即时获取,您可以通过将以下映射块添加到您的 Author 域类来修改 ORM DSL:

static mapping = {
    books lazy:false
}

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

static fetchMode = [books:"eager"]

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

【讨论】:

  • 谢谢。但我对问题的另一面很感兴趣,因为您在说:您确实要小心可能会加载比您预期更多的数据的后果。 -o 查询的方式有误?我找到了一个解决方案,将参数 fetch 添加到查询中: - def book2 = Book.findAllByAuthor(author, [fetch:[publisher:'eager']])) 我也得到了发布者。如果发布者有任何其他我需要检索的实体,我该怎么办?添加和添加参数。谢谢。
  • 如果您没有定义 Publisher 使用 Eager fetch 模式引用的其他对象,那么据我所知,您将不得不遍历该对象。
  • 我不想一遍又一遍地迭代这是我的问题。对 DDBB 的访问过多。如果我发现了什么,我会在这里发布。感谢您抽出宝贵的时间并很快得到很好的答案。
【解决方案2】:

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

【讨论】:

  • 格式不正确:def book2 = Book.get(author) 这样:def book2 = Book.findByAuthor(author) 我只有书籍和作者域的数据,而不是出版商的数据。
【解决方案3】:

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

例子:

def c = Teacher.createCriteria()

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

【讨论】:

    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多