These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: <properties> element causes exception in interface cla
PostPosted: Tue May 24, 2005 8:40 pm 
Beginner
Beginner

Joined: Thu Jan 29, 2004 6:51 pm
Posts: 24
Location: Boulder, CO USA
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


Top
 Profile  
 
 Post subject:
PostPosted: Tue May 24, 2005 8:46 pm 
Hibernate Team
Hibernate Team

Joined: Tue Aug 26, 2003 12:50 pm
Posts: 5130
Location: Melbourne, Australia
Yes, this is correct and expected. (Hibernate needs somewhere to deepcopy to.) So, it looks like there is something suboptimal where <properties> don't work on an abstract superclass. Hmmmm.

Add to JIRA, there is an easy fix, I think.


Top
 Profile  
 
 Post subject:
PostPosted: Tue May 24, 2005 11:01 pm 
Beginner
Beginner

Joined: Thu Jan 29, 2004 6:51 pm
Posts: 24
Location: Boulder, CO USA
Done. Thanks. This one was making me nuts for a while.


http://opensource.atlassian.com/projects/hibernate/browse/HHH-535


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 12, 2005 11:41 am 
Newbie

Joined: Tue Jul 12, 2005 11:31 am
Posts: 4
Location: Nashville, TN USA
Hmm. I think I am being bitten by this bug. I am mapping to a very fun legacy schema. Anyway, my main business object has a collection whose components are subclasses of an abstract parent class (table-per-hierarchy w/ discriminator column). The snag is that I need, additionally, to map one of these entities as a component of the business object. I have a <class entity-name="foo" where="bar" abstract="true"> construct to handle this, mapping the discriminator and subclasses as in the main class mapping; i.e. the one not qualified with an entity-name. Gavin commented on issue HH-535:

Quote:
A problem with similar roots occurs if you define an abstract root class with a composite key and try to query the root class.


This sounds like my situation, does it not? Any known workarounds?

Thanks,
Matt


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 12, 2005 11:49 am 
Newbie

Joined: Tue Jul 12, 2005 11:31 am
Posts: 4
Location: Nashville, TN USA
Quote:
Any known workarounds?


Other than the obvious of making the parent class non-abstract, that is. :)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.