2

我的实体角色中的代码

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

测试ID类

@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   

实体管理器创建查询,尝试访问列 CODE 和 WORK 而不是@Column注释中的 TSTCODE 和 TSTWRk。
有任何想法吗?

休眠注释 3.2.1.ga
持久性 API 1.0
jboss-4.2.3.GA

更新:

如果将 TestID 类中的字段重命名为表的列名,则所有操作都正常

@Embeddable
@AccessType("field")
public class TestID implements Serializable 
{
   private String tstcode;

   private String tstwks;  
4

2 回答 2

3

删除@CollectionOfElements并使用@Embedded. 我认为您正在对它进行双重映射,就像现在一样。此外,JPA 的@ElementCollection推荐优于Hibernate 的@CollectionOfElements.

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

于 2012-04-30T13:07:19.437 回答
1

根据休眠建议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"))
})
于 2012-04-30T13:22:00.313 回答