-->
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.  [ 1 post ] 
Author Message
 Post subject: Union-Subclass and One to many relationship problem
PostPosted: Mon Jul 05, 2010 2:14 am 
Newbie

Joined: Mon Jul 05, 2010 1:47 am
Posts: 1
Hi
I have a business requirement in which i have two different tables with same attributes and similar relationships.I have tried to model by the use of union-subclass (Table per concrete class) strategy so that if i need to add something i can just make a change in superclass's HBM file and java file.Here are my mappings.

An abstract Parent Class A

Code:
<class name="A" abstract="true"  >
<id name="aId" type="long"   column="ID">
   <generator class="native" />
  </id>
</class>



Subclass A1 which has one to many bidirectional relationship with another union-subclass B1

Code:
<union-subclass name="A1" table="A1"
      extends="A">

<set name="b1" lazy="true" cascade="save-update,delete"
         inverse="true">
<key column="aId" not-null="true" />
<one-to-many class="B1" />
</set>
</union-subclass>


Abstract parent class B

Code:
<class name="B" abstract="true"  >
<id name="bId" type="long"   column="ID">
   <generator class="native" />
  </id>
</class>



Subclass B1 which many-to-one relationship with A1

Code:
<union-subclass name="B1" table="B1"
      extends="B">

<many-to-one name="a" column="aId"
         class="A1" cascade="save-update" lazy="true" />
</union-subclass>


Now when i am trying to persist A1 and then load it by using session.load method i am getting object not found exception.Here is the complete trace.

Code:
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com..entities.B1#1]
   at org.hibernate.ObjectNotFoundException.throwIfNull(ObjectNotFoundException.java:27)
   at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:128)
   at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:177)
   at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
   at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
   at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)
   at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
   at org.hibernate.type.EntityType.resolve(EntityType.java:303)
   at org.hibernate.type.EntityType.nullSafeGet(EntityType.java:217)
   at org.hibernate.persister.collection.AbstractCollectionPersister.readElement(AbstractCollectionPersister.java:644)
   at org.hibernate.collection.PersistentSet.readFrom(PersistentSet.java:262)
   at org.hibernate.loader.Loader.readCollectionElement(Loader.java:994)
   at org.hibernate.loader.Loader.readCollectionElements(Loader.java:635)
   at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580)
   at org.hibernate.loader.Loader.doQuery(Loader.java:689)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
   at org.hibernate.loader.Loader.loadCollection(Loader.java:1919)
   at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:36)
   at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:520)
   at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:60)
   at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1676)
   at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:454)
   at org.hibernate.engine.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:755)
   at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:229)
   at org.hibernate.loader.Loader.loadEntity(Loader.java:1785)
   at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:47)
   at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:41)
   at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
   at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
   at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
   at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
   at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:82)
   at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
   at org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:820)
   at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:62)
   at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
   at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at junit.framework.TestCase.runTest(TestCase.java:168)
   at junit.framework.TestCase.runBare(TestCase.java:134)
   at junit.framework.TestResult$1.protect(TestResult.java:110)
   at junit.framework.TestResult.runProtected(TestResult.java:128)
   at junit.framework.TestResult.run(TestResult.java:113)
   at junit.framework.TestCase.run(TestCase.java:124)
   at junit.framework.TestSuite.runTest(TestSuite.java:232)
   at junit.framework.TestSuite.run(TestSuite.java:227)
   at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
   at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
   at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)



Id (1) exists in table A1 not B1. But while generating sql queries hibernate is trying to load B1 with Id that exists in A1.

Note: if i remove union-subclass strategy from B's hierarchy and use implicipt polymorphism in B1 this association is working fine.

Please let me know what am i doing wrong which is causing this exception.

Thanks in advance


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

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.