【问题标题】:Grails 2.5.3 domain class with List of embedded objects带有嵌入对象列表的 Grails 2.5.3 域类
【发布时间】:2016-05-08 11:52:18
【问题描述】:

在 Grails 2.5.3 域类中,如何创建嵌入对象的 List 属性(不是域对象,也不是 String、Integer 等基本类型)?

我尝试了很多 static embedded、static hasMany 等的组合,但似乎都没有用。

大多数时候,我在运行 run-app 时遇到以下异常:

org.hibernate.MappingException

Missing type or column

for column[list_property_embedded_class]

on domain[DomainClass]

referencing[EmbeddedClassFQCN]

[] 中的值被我的实际类/列名替换。

(我重新分隔异常消息以使其更具可读性;它实际上是单行)

【问题讨论】:

  • 什么样的嵌入对象?来自src/groovy 的课程?您希望这些对象持久化到数据库还是瞬态?
  • 我希望保留的来自src/groovy 的类,但不需要是单独的实体,并且我还希望将其用作普通的嵌入对象属性;例如,对于嵌入式对象类EmbeddedObject,有时我需要EmbeddedObject 类型的属性,有时需要List<EmbeddedObject> 类型的属性。我无法让后者工作。
  • 谁对这个问题投了反对票,请解释原因,也许我可以改进这个问题。如果这是因为我没有指定我想要嵌入对象是持久的还是瞬态的:我没有提到是因为我认为嵌入的对象总是持久的(即没有像瞬态嵌入对象这样的东西;它会只是短暂的)。

标签: hibernate grails grails-orm hibernate-4.x grails-2.5


【解决方案1】:

如果您求助于使用传统的 hibernate 而不是 GORM,那么您正在寻找的将是 @ElementCollection 注释。来自 Hibernate 的示例:

@Entity
public class User {
   [...]
   public String getLastname() { ...}

   @ElementCollection
   @CollectionTable(name="Addresses", joinColumns=@JoinColumn(name="user_id"))
   @AttributeOverrides({
      @AttributeOverride(name="street1", column=@Column(name="fld_street"))
   })
   public Set<Address> getAddresses() { ... } 
}

@Embeddable
public class Address {
   public String getStreet1() {...}
   [...]
}

我尝试使用单个域类和来自src/groovy 的类列表创建一个测试项目,但没有成功。我尝试了将注释从 @ElementCollection 应用到他们示例中的所有内容的不同变体,但没有成功。我的假设是 Hibernate 注释根本不适用于 Grails 域类。这得到了Grails documentation 的进一步支持,该注释将注释应用于src/java 中的POJO。对我来说,我不认为这是一个值得的选择。

至于 GORM 等效于 @ElementCollection,在 Grails 中为该确切功能打开了未解决的 JIRA 票证:GRAILS-10095。

我质疑嵌入式对象集合的必要性或好处;与传统的嵌入对象(支持static embedded)不同,它会在域类的 SQL 表中真正嵌入附加列,嵌入集合将涉及另一个表。从事 Hibernate 工作的人比我聪明,所以我确信这是有充分理由的。

【讨论】:

  • 感谢所有调查。不过,我暂时不会将您的帖子标记为答案,以防其他人知道如何在 GORM 中执行此操作,但是,从 JIRA 票证来看,在 GORM 中似乎是不可能的。我想要@ElementCollection 的原因是因为我想将一个类都用作普通的嵌入对象,但有时我需要将它放在 List 属性中,而不是作为普通的单值属性。没有@ElementCollection,我无法做到这一点。此外,有时,某些数据本身不应该被访问:引用类可能有代码来保持它的一致性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多