我有一个非常简单的类层次结构,如下所示,每个子类都有一个@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抱怨是因为它在原始表中查找字段时应该在辅助表中查找字段。

10-07 17:07