我有一个非常简单的类层次结构,如下所示,每个子类都有一个@DiscriminatorValue枚举类型,效果很好。
抽象类:
AbstractNode(抽象类映射到Node表)
子类:
FieldNode(简单类也映射到Node表,但是具有不同的@DiscriminatorValue值)
SynonymNode(问题类,该类也使用不同的@DiscriminatorValue值映射到Node表)
但ALSO具有@SecondaryTable属性,并具有额外的列,例如DeletedDate,createdDate等...,每个都映射到@SecondaryTable属性中定义的表中的列。
当我对该节点表执行简单的休眠查询时,就会出现即时通讯问题
我收到如下错误:
org.hibernate.exception.GenericJDBCException:无法执行查询
...
堆栈跟踪
...
原因:java.sql.SQLException:无效的列名
在我的日志中,我可以看到:
休眠:
选择
*
从
vocab_node
哪里
较低的(名称),例如'%'|| ? || '%'
INFO [NullableType.java:132]:无法从结果集中读取列值:DELETED_DATE;无效的列名
我的猜测是,它在数据库表中找到一行,然后确定它是SynonymNode类类型(通过@DiscriminatorValue列),然后尝试填充该类,其中包括与@SecondaryTable映射的额外的列表。
我该如何告诉它,左联接@SecondaryTable或完全排除此特定查询?
谢谢堆!这个问题使我丧命!
我正在运行Hibernate 3.2.1和Java 1.5
干杯,
标记
最佳答案
我相信问题是您必须指定要映射到@SecondaryTable的字段...
在@Column批注中,设置“表格”属性:@Column(name =“ somecol”,table =“ secondaryTable”)
Hibernate抱怨是因为它在原始表中查找字段时应该在辅助表中查找字段。