Hibernate developers and/or gurus, please look at the following code I found suspicious that in Hibernate is bug. From following code the irrelevant properties and mapping was removed (and like that it was also tested). I've spent a whole day solving this problem with no result.
Using "Table per subclass" - Hibernate throws an exception (why?). Using "Table per concrete class" Hibernate runs without problems.
Table per subclass: BLOCK 1 is not commented out, BLOCK 2 is commented out
Table per concrete class: BLOCK 1 is commented out, BLOCK 2 is not commented out
Hibernate version: 3.0.5
Mapping documents:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.kovine.kfe.dao.TableColumn" table="KFE_TABLE_COLUMN">
<id name="id" unsaved-value="null" column="TABLE_COLUMN_ID">
<generator class="sequence">
<param name="sequence">KFE_TABLE_COLUMN_ID_SEQ</param>
</generator>
</id>
</class>
<class name="com.kovine.kfe.dao.Widget" table="KFE_WIDGET">
<id name="id" unsaved-value="null" column="WIDGET_ID">
<generator class="sequence">
<param name="sequence">KFE_WIDGET_ID_SEQ</param>
</generator>
</id>
<!-- BLOCK 1:
<joined-subclass name="com.kovine.kfe.dao.WidgetText" table="KFE_WIDGET_TYPE_INPUTTEXT">
<key column="WIDGET_ID" />
<many-to-one unique="true" name="tableColumn" class="com.kovine.kfe.dao.TableColumn" cascade="all" column="TABLE_COLUMN_ID" not-null="true" />
</joined-subclass>
-->
</class>
<!-- BLOCK 2 -->
<class name="com.kovine.kfe.dao.WidgetType">
<id name="id" unsaved-value="null" column="WIDGET_TYPE_ID">
<generator class="sequence">
<param name="sequence">KFE_WIDGET_ID_SEQ</param>
</generator>
</id>
<union-subclass name="com.kovine.kfe.dao.WidgetText" table="KFE_WIDGET_TYPE_INPUTTEXT">
<many-to-one unique="true" name="tableColumn" class="com.kovine.kfe.dao.TableColumn" cascade="all" column="TABLE_COLUMN_ID" not-null="true" />
</union-subclass>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():none. sessionFactory.openSession() causes exception
Code:
public class WidgetText extends WidgetType {
private TableColumn tableColumn;
public TableColumn getTableColumn() {
return tableColumn;
}
public void setTableColumn(TableColumn tableColumn) {
this.tableColumn = tableColumn;
}
}
public abstract class WidgetType {
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
Full stack trace of any exception that occurs:
INFO Configuration - Mapping resource: com/kovine/kfe/dao/TableColumn.hbm.xml
INFO HbmBinder - Mapping class: com.kovine.kfe.dao.TableColumn -> KFE_TABLE_COLUMN
INFO HbmBinder - Mapping class: com.kovine.kfe.dao.Widget -> KFE_WIDGET
INFO HbmBinder - Mapping class: com.kovine.kfe.dao.WidgetType -> WidgetType
INFO HbmBinder - Mapping union-subclass: com.kovine.kfe.dao.WidgetText -> KFE_WIDGET_TYPE_INPUTTEXT
INFO Configuration - Configured SessionFactory: null
INFO Configuration - processing extends queue
INFO Configuration - processing collection mappings
INFO Configuration - processing association property references
INFO Configuration - processing foreign key constraints
INFO Dialect - Using dialect: org.hibernate.dialect.Oracle9Dialect
INFO SettingsFactory - Default batch fetch size: 1
INFO SettingsFactory - Generate SQL with comments: disabled
INFO SettingsFactory - Order SQL updates by primary key: disabled
INFO SettingsFactory - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
INFO ASTQueryTranslatorFactory - Using ASTQueryTranslatorFactory
INFO SettingsFactory - Query language substitutions: {}
INFO NamingHelper - JNDI InitialContext properties:{}
INFO DatasourceConnectionProvider - Using datasource: java:comp/env/jdbc/kfe
INFO SettingsFactory - JDBC batch size: 15
INFO SettingsFactory - JDBC batch updates for versioned data: disabled
INFO SettingsFactory - Scrollable result sets: enabled
INFO SettingsFactory - JDBC3 getGeneratedKeys(): disabled
INFO TransactionFactoryFactory - Using default transaction strategy (direct JDBC transactions)
INFO TransactionManagerLookupFactory - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
INFO SettingsFactory - Automatic flush during beforeCompletion(): disabled
INFO SettingsFactory - Automatic session close at end of transaction: disabled
INFO SettingsFactory - Cache provider: org.hibernate.cache.EhCacheProvider
INFO SettingsFactory - Second-level cache: enabled
INFO SettingsFactory - Optimize cache for minimal puts: disabled
INFO SettingsFactory - Structured second-level cache entries: enabled
INFO SettingsFactory - Query cache: disabled
INFO SettingsFactory - Statistics: disabled
INFO SettingsFactory - Deleted entity synthetic identifier rollback: disabled
INFO SettingsFactory - Default entity-mode: pojo
INFO SessionFactoryImpl - building session factory
ERROR HibernateUtil - Initial SessionFactory creation failed.
org.hibernate.MappingException: Could not determine type for column TABLE_COLUMN_ID of type org.hibernate.type.ManyToOneType: org.hibernate.MappingException
at org.hibernate.mapping.Column.getSqlTypeCode(Column.java:131)
at org.hibernate.persister.entity.UnionSubclassEntityPersister.generateSubquery(UnionSubclassEntityPersister.java:320)
at org.hibernate.persister.entity.UnionSubclassEntityPersister.<init>(UnionSubclassEntityPersister.java:135)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:61)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:199)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1043)
at com.kovine.kfe.HibernateUtil.<clinit>(HibernateUtil.java:30)
...
Caused by: org.hibernate.MappingException: Unknown entity: com.kovine.kfe.dao.TableColumn
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:489)
at org.hibernate.impl.SessionFactoryImpl.getIdentifierType(SessionFactoryImpl.java:563)
at org.hibernate.type.EntityType.getIdentifierType(EntityType.java:216)
at org.hibernate.type.EntityType.getIdentifierOrUniqueKeyType(EntityType.java:226)
at org.hibernate.type.ManyToOneType.sqlTypes(ManyToOneType.java:29)
at org.hibernate.mapping.Column.getSqlTypeCode(Column.java:124)
... 87 morete.type.ManyToOneType.sqlTypes(ManyToOneType.java:29)
at org.hibernate.mapping.Column.getSqlTypeCode(Column.java:124)
... 87 morere
Name and version of the database you are using:
Oracle 9i (irrelevant)
The generated SQL (show_sql=true):
none
Martin