java - AttributeOverride 和 CollectionOfElements,忽略列注释

标签 java hibernate jpa

来 self 的实体角色的代码

   @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。
有什么想法吗?

Hibernate-annotation 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;  

最佳答案

删除 @CollectionOfElements 并只使用 @Embedded。我认为您现在正在对其进行双重映射。此外,JPA 的 @ElementCollectionrecommended over Hibernate 的 @CollectionOfElements

更新:我有点想念您正在映射一组组件这一事实。您需要将 @Column(name="...") 添加到您的 TestID 中的字段,以使其在这种情况下正确映射。尽管这与嵌入式组件的工作方式有些背道而驰,但这是我所知道的唯一方式。

关于java - AttributeOverride 和 CollectionOfElements,忽略列注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383607/

相关文章:

java - ConcurrentSkipListSet 和重新排序 (java)

java - 保存新实体时在 ManyToOne/OneToMany 关系上创建重复条目

java - Spring REST - 从实体构建链接

jpa - javax.persistence.Entity 不存在

java - Android:空指针异常

java - 机器人类右键单击然后左键单击问题

hibernate 默认连接池

java - 使用 Hibernate 查询 SQL Server 2005 加密列的 Web 应用程序

java - 如何在 chrome 中使用 selenium 拖放 canvas web 元素

java - 分离的对象如何在 hibernate 中工作