Hibernate version: 3.0.3
I am using the <properties> element to map some legacy data. It appears that Hibernate is trying to create a component POJO for the <properties> element with the type of the enclosing class, which is an interface. Is this expected behavior?
<hibernate-mapping>
<class name="Address" table="ADDRESS" proxy="Address">
<meta attribute="interface" inherit="false">true</meta>
<id name="addressId" type="long" column="ADDRESS_ID"/>
<discriminator column="ADDRESS_TYPE" type="string" length="30" />
<properties name="uniqueAddress">
<property name="addressType" column="ADDRESS_TYPE" type="string" insert="false" update="false" length="30" />
<many-to-one name="server" column="SERVER_ID" class="Server" not-null="true" />
</properties>
<subclass name="AddressImpl" discriminator-value="null" proxy="Address">
</subclass>
</class>
<class name="Server" table="SERVER"
proxy="Server">
<meta attribute="interface"
inherit="false">true</meta>
<id name="serverId" type="long"
column="SERVER_ID">
<discriminator column="SERVER_TYPE"
type="string" length="10"/>
<property name="serverType" type="string"
column="SERVER_TYPE" length="10"
update="false" insert="false"/>
<subclass name="ServerImpl"
discriminator-value="null"
proxy="Server">
<many-to-one name="address"
class="AddressImpl"
property-ref="uniqueAddress"
cascade="all-delete-orphan"
unique="true"
update="false" insert="false">
<column name="ADDRESS_TYPE"/>
<column name="SERVER_ID"/>
</many-to-one>
</subclass>
</class>
</hibernate-mapping>
When I create a new Server and add a ServerAddress, Hibernate throws an Exception during the cascade, It seems to be trying to instantiate the <properties> "component":
Quote:
org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: Address
org.springframework.orm.hibernate3.HibernateSystemException: Cannot instantiate abstract class or interface: Address; nested exception is org.hibernate.InstantiationException: Cannot instantiate abstract class or interface: Addressorg.hibernate.InstantiationException: Cannot instantiate abstract class or interface: Address at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:56) at org.hibernate.tuple.AbstractComponentTuplizer.instantiate(AbstractComponentTuplizer.java:89) at org.hibernate.type.ComponentType.instantiate(ComponentType.java:344) at org.hibernate.type.ComponentType.deepCopy(ComponentType.java:301) at org.hibernate.type.TypeFactory.deepCopy(TypeFactory.java:290) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:226) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:159) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:96) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:464) at org.hibernate.engine.Cascades$5.cascade(Cascades.java:154) at org.hibernate.engine.Cascades.cascadeAssociation(Cascades.java:771) at org.hibernate.engine.Cascades.cascade(Cascades.java:720) at org.hibernate.engine.Cascades.cascade(Cascades.java:847) at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:331) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:213) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:159) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184) at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173) at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:477) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:472)
According to Hibernate DEBUG logs, everything looks to be working until it tries to cascade save the AddressImpl, and it rolls back.
Quote:
2005-05-24 18:27:31,183 DEBUG engine.PersistenceContext - initializing non-lazy collections
2005-05-24 18:27:31,190 DEBUG def.DefaultSaveOrUpdateEventListener - saving transient instance
2005-05-24 18:27:31,193 DEBUG jdbc.AbstractBatcher - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
2005-05-24 18:27:31,194 DEBUG jdbc.AbstractBatcher - select SERVER_INFO_SEQ.nextval from dual
2005-05-24 18:27:31,195 DEBUG jdbc.AbstractBatcher - preparing statement
2005-05-24 18:27:31,237 DEBUG id.SequenceGenerator - Sequence identifier generated: 203783
2005-05-24 18:27:31,237 DEBUG jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2005-05-24 18:27:31,240 DEBUG jdbc.AbstractBatcher - closing statement
2005-05-24 18:27:31,241 DEBUG def.AbstractSaveEventListener - generated identifier: 203783, using strategy: org.hibernate.id.SequenceGenerator
2005-05-24 18:27:31,244 DEBUG def.AbstractSaveEventListener - saving [ServerImpl#203783]
2005-05-24 18:27:31,248 DEBUG engine.Cascades - processing cascade ACTION_SAVE_UPDATE for: ServerImpl
2005-05-24 18:27:31,249 DEBUG engine.Cascades$5 - cascading to saveOrUpdate: AddressImpl
2005-05-24 18:27:31,254 DEBUG def.AbstractSaveEventListener - transient instance of: AddressImpl
2005-05-24 18:27:31,255 DEBUG def.DefaultSaveOrUpdateEventListener - saving transient instance
2005-05-24 18:27:31,255 DEBUG jdbc.AbstractBatcher - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
2005-05-24 18:27:31,256 DEBUG jdbc.AbstractBatcher - select SERVER_ADDRESS_SEQ.nextval from dual
2005-05-24 18:27:31,257 DEBUG jdbc.AbstractBatcher - preparing statement
2005-05-24 18:27:31,264 DEBUG id.SequenceGenerator - Sequence identifier generated: 2007899
2005-05-24 18:27:31,266 DEBUG jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2005-05-24 18:27:31,267 DEBUG jdbc.AbstractBatcher - closing statement
2005-05-24 18:27:31,268 DEBUG def.AbstractSaveEventListener - generated identifier: 2007899, using strategy: org.hibernate.id.SequenceGenerator
2005-05-24 18:27:31,269 DEBUG def.AbstractSaveEventListener - saving [AddressImpl#2007899]
2005-05-24 18:27:31,282 DEBUG transaction.JDBCTransaction - rollback
2005-05-24 18:27:31,282 DEBUG jdbc.JDBCContext - before transaction completion
2005-05-24 18:27:31,283 DEBUG impl.SessionImpl - before transaction completion
2005-05-24 18:27:31,284 DEBUG transaction.JDBCTransaction - re-enabling autocommit
2005-05-24 18:27:31,285 DEBUG transaction.JDBCTransaction - rolled back JDBC Connection
2005-05-24 18:27:31,286 DEBUG jdbc.JDBCContext - after transaction completion
2005-05-24 18:27:31,286 DEBUG impl.SessionImpl - after transaction completion
2005-05-24 18:27:31,292 DEBUG impl.SessionImpl - closing session
2005-05-24 18:27:31,292 DEBUG jdbc.AbstractBatcher - closing JDBC connection (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)
2005-05-24 18:27:31,297 DEBUG jdbc.JDBCContext - after transaction completion
2005-05-24 18:27:31,297 DEBUG impl.SessionImpl - after transaction completion