AttributeOverride和CollectionOfElements,列注释被忽略

时间:2012-04-30 12:20:36

标签: java hibernate jpa

我的实体的代码角色

   @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;  

2 个答案:

答案 0 :(得分:2)

删除@CollectionOfElements,然后使用@Embedded。我认为你现在正在对它进行双重映射。此外,JPA的@ElementCollectionrecommended over Hibernate的@CollectionOfElements

更新:我错过了您正在映射组件集合的事实。您需要在@Column(name="...")中的字段中添加TestID,以便在这种情况下正确映射。即使它与嵌入式组件的工作方式有些相反,但这是我知道的唯一方法。

答案 1 :(得分:1)

根据休眠recommendations2.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"))
})
相关问题