【问题标题】:Grails HasMany List Relation to Extended Class having BelongsTo RelationshipGrails HasMany 列表关系到具有 BelongsTo 关系的扩展类
【发布时间】:2015-05-29 20:40:36
【问题描述】:

我在将 List 设置为与扩展类的 belongsTo 的 hasMany 关系时遇到问题。

使用新的 Grails 2.4.4 应用程序,我拥有以下 3 个域:

一个拥有许多书籍的 Author 类。

class Author {
    List books
    static hasMany = [books: Book]
}

扩展 Content 的 Book 类

class Book extends Content {
    String foo
}

还有Content,它有很多共同的属性。

class Content {
    String title
    static belongsTo = [author: Author]
    static constraints = {
        sort: 'title'
    }
}

运行此应用程序时出现以下异常:

原因:org.hibernate.MappingException:实体映射中的重复列:test.relationships.Book 列:author_id(应使用 insert="false" update="false" 进行映射)

只有当我将书籍设为列表时才会出现此异常。

【问题讨论】:

  • 是否需要将books定义为列表?我认为默认情况下它被视为hasMany 表示法的列表,因此您无需将其定义为单独的变量。因此,您的“重复专栏”。只是猜测。
  • 实际上默认情况下,books 是一个集合。我认为像这样指定类型是确保books 集合映射为列表的正确方法。

标签: grails grails-orm


【解决方案1】:

我认为问题可能与您说Author 有许多Books 的事实有关,但Book 的超类Content 属于Authur

如果您将 ContentBook 类更改为:

class Content {
    String title
    static constraints = {
        sort: 'title'
    }
}

class Book extends Content {
    static belongsTo = [author: Author]
    String foo
}

或者,或者,将您的 Author 类更改为:

class Author {
    List books
    static hasMany = [contents: Content]
}

【讨论】:

  • 这会破坏关系在父类上的目的。如果我有 20 个不同的类是 Content 的子类,那么我需要指定每个子类的关系。您的解决方案只是消除了我使用扩展的事实。并将作者更改为在其 hasMany 中引用内容将返回所有孩子,即使是那些不是书籍的孩子(例如,如果同一作者有一些专辑)问题是我知道每个内容都有一个作者,但我只想获取某些列表内容类型。
猜你喜欢
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2015-08-24
  • 1970-01-01
相关资源
最近更新 更多