在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]
[]中的值被我的实际类/列名替换。
(我重新分隔异常消息以使其更具可读性;它实际上是一个单行)
答案 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上工作的人比我聪明,所以我确信有一个很好的理由。