Grails 2.5.3具有嵌入对象列表的域类

时间:2016-01-30 20:19:37

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

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

我已经尝试了static embeddedstatic hasMany等许多组合,但似乎都没有。

大多数情况下,运行run-app时会出现以下异常:

org.hibernate.MappingException

Missing type or column

for column[list_property_embedded_class]

on domain[DomainClass]

referencing[EmbeddedClassFQCN]

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

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

1 个答案:

答案 0 :(得分:1)

如果您使用传统的休眠而不是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上工作的人比我聪明,所以我确信有一个很好的理由。