我的实体的代码角色
@Embedded
@LazyCollection(LazyCollectionOption.FALSE)
@CollectionOfElements
@JoinTable(name = "TEST_TABLE", joinColumns = @JoinColumn(name = "ROLE_ID"))
@AttributeOverrides({
@AttributeOverride(name = "code", column = @Column(name = "TSTCODE")),
@AttributeOverride(name = "work", column = @Column(name = "TSTWRK"))
})
private List<TestID> tests;
}
TestID类
@Embeddable
@AccessType("field")
public class TestID implements Serializable
{
private String code;
private String work;
// getters, setters
}
获取异常 SQLGrammarException
Caused by: java.sql.SQLException: ORA-00904: "TESTS0_"."WORK": invalid identifier
实体管理器创建查询,尝试访问 @Column 注释中的CODE和WORK列而不是TSTCODE和TSTWRk。
有什么想法吗?
Hibernate-annotation 3.2.1.ga
persistance-api 1.0
jboss-4.2.3.GA
更新:
如果将TestID类中的字段重命名为表的列名,那么所有的wark通常都是
@Embeddable
@AccessType("field")
public class TestID implements Serializable
{
private String tstcode;
private String tstwks;
答案 0 :(得分:2)
删除@CollectionOfElements
,然后使用@Embedded
。我认为你现在正在对它进行双重映射。此外,JPA的@ElementCollection
是recommended over Hibernate的@CollectionOfElements
。
更新:我错过了您正在映射组件集合的事实。您需要在@Column(name="...")
中的字段中添加TestID
,以便在这种情况下正确映射。即使它与嵌入式组件的工作方式有些相反,但这是我知道的唯一方法。
答案 1 :(得分:1)
根据休眠recommendations(2.2.5.3.3. Collection of basic types or embeddable objects
),你应该使用
@ElementCollection
@CollectionTable(name="TEST_TABLE", joinColumns = @JoinColumn(name = "ROLE_ID"))
@AttributeOverrides({
@AttributeOverride(name = "code", column = @Column(name = "TSTCODE")),
@AttributeOverride(name = "work", column = @Column(name = "TSTWRK"))
})