今天在开发的项目模块中,利用hibernate自动创建表时报org.hibernate.AnnotationException: @org.hibernate.annotations.Table references an unknown table: 原因是注解类用了@org.hibernate.annotations.Table,如下所示:(Hibernat 版本为3.6.0.Final)
</pre><span style="color:#cc7832;"></span><pre name="code" class="java">
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import org.hibernate.annotations.Index;
import org.hibernate.annotations.Table
@Entity
@Table(appliesTo = "WJ_PERSION", indexes = {
@Index(name = "IDX_WJ_PN_ID", columnNames = {
"BASE_RES_ID"
})
})
@Inheritance(strategy = InheritanceType.JOINED)
public class Persion extends BaseResource {
private String name;
...
}
后来通过google查询原因,是因为在Hibernate创建表的源码中需要@Table的“appliesTo”的值与@Entity的“name”能够匹配上,不然就会抛出org.hibernate.AnnotationException:的异常:Hibernate中的源码如下;
public void processComplementaryTableDefinitions(org.hibernate.annotations.Table table) {
//comment and index are processed here
if ( table == null ) return;
String appliedTable = table.appliesTo();
Iterator tables = persistentClass.getTableClosureIterator();
Table hibTable = null;
while ( tables.hasNext() ) {
Table pcTable = (Table) tables.next();
// -=> Here the quoted name is compared to the unquoted name from "appliedTable"
if ( pcTable.getQuotedName().equals( appliedTable ) ) {
//we are in the correct table to find columns
hibTable = pcTable;
break;
}
hibTable = null;
}
if ( hibTable == null ) {
//maybe a join/secondary table
for ( Join join : secondaryTables.values() ) {
if ( join.getTable().getQuotedName().equals( appliedTable ) ) {
hibTable = join.getTable();
break;
}
}
}
if ( hibTable == null ) {
throw new AnnotationException(
"@org.hibernate.annotations.Table references an unknown table: " + appliedTable
);
}
if ( !BinderHelper.isEmptyAnnotationValue( table.comment() ) ) hibTable.setComment( table.comment() );
TableBinder.addIndexes( hibTable, table.indexes(), mappings );
}
具体描述可参考:https://hibernate.atlassian.net/browse/HHH-6328
如上可将注解部分的代码的@Entity中添加name属性并与@Table中的appliesTo属性保存一致。
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import org.hibernate.annotations.Index;
import org.hibernate.annotations.Table
<span style="color:#FF0000;">@Entity(name="WJ_PERSION")</span>
@Table(appliesTo = "<span style="color:#FF0000;">WJ_PERSION</span>", indexes = {
@Index(name = "IDX_WJ_PN_ID", columnNames = {
"BASE_RES_ID"
})
})
@Inheritance(strategy = InheritanceType.JOINED)
public class Persion extends BaseResource {
private String name;
...
}