-->
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.  [ 4 posts ] 
Author Message
 Post subject: session.load() with subclass
PostPosted: Mon Mar 14, 2005 1:03 pm 
Newbie

Joined: Mon Mar 14, 2005 12:29 pm
Posts: 3
Location: London, U.K.
Hi,

my first experiment with Hibernate3 (3.0rc1).

I have a Topic class, which is a subclass of Post (table per class hierarchy strategy)

Code:
   <class name="Post" table="post">
               
      <id name="id"><generator class="native"/></id>

      <discriminator column="post_type" type="string"/>

      <many-to-one name="forum" column="forum_id" not-null="true"/>

      <many-to-one name="user" column="user_id" not-null="true"/>

      <property name="date" column="post_date" type="timestamp"/>

      <property name="message"/>
      
      <subclass name="Topic" discriminator-value="topic">
         <property name="title"/>
      </subclass>            

      <subclass name="Reply" discriminator-value="reply">
         <many-to-one name="Topic" column="topic_id"/>
      </subclass>

   </class>



trying to load a specific instance of Topic

Code:
  Session session = sessionFactory.openSession();
  Topic topic = (Topic) session.load(Topic.class, new Long(1));
  session.close();



results in the following exception

Code:
Exception in thread "main" java.lang.NullPointerException
   at org.hibernate.tuple.AbstractTuplizer.createProxy(AbstractTuplizer.java:249)
   at org.hibernate.persister.entity.BasicEntityPersister.createProxy(BasicEntityPersister.java:2801)
   at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:242)
   at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:123)
   at org.hibernate.impl.SessionImpl.load(SessionImpl.java:549)
   at org.hibernate.impl.SessionImpl.load(SessionImpl.java:544)
   at persistence.PersistenceTest.main(PersistenceTest.java:18)



Retrieving the same instance as a Post (superclass) instead works fine.

Retrieving the same instance as a Topic but using session.get() instead of load() works too.

The same code in Hibernate 2.1.8 works fine.

Database is HSQLdb 1.8.0rc9. No SQL is printed out when the exception occurs. When using get() instead of load() the SQL is

Code:
  select topic0_.id as id0_, topic0_.forum_id as forum3_2_0_, topic0_.user_id as user4_2_0_, topic0_.post_date as post5_2_0_, topic0_.message as message2_0_, topic0_.title as title2_0_ from post topic0_ where topic0_.id=?



I am a bit confused about this session.get() vs. load(). My understand of the API docs was that load() is ok when the instance is supposed to exist. Should I just use get() instead?

Thanks

Mirko


Top
 Profile  
 
 Post subject: Re: session.load() with subclass
PostPosted: Mon Mar 14, 2005 1:50 pm 
Newbie

Joined: Mon Mar 14, 2005 12:29 pm
Posts: 3
Location: London, U.K.
Solved.

The Topic class had a private no-arg constructor and CGLIB was not happy about that. Nothing to do with inheritance.

My fault, I didn't follow this recommendation from the reference

Quote:
4.1.2. Implement a no-argument constructor

Cat has a no-argument constructor. All persistent classes must have a default constructor (which may be non-public) so Hibernate can instantiate them using Constructor.newInstance(). We recommend having a constructor with at least package visibility for runtime proxy generation in Hibernate.


(which seems to be a requirement more than a recommendation anyway)

Thanks

Mirko


Top
 Profile  
 
 Post subject: session.load() exception with private default constructor
PostPosted: Tue Mar 15, 2005 5:43 am 
Newbie

Joined: Mon Mar 14, 2005 12:29 pm
Posts: 3
Location: London, U.K.
Ok using a default constructor with at least package visibility as recommended in the documentation solves the problem.

But that NullPointerException when using a private constructor seems a buglet to me. Especially since it works fine in Hibernate 2.1.

Here's the full debug log (on a different entity)

Code:
1722 [main] ERROR org.hibernate.proxy.BasicLazyInitializer  - CGLIB Enhancement failed: forum.Forum
java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
   at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:783)
   at net.sf.cglib.proxy.Enhancer.emit(Enhancer.java:749)
   at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:481)
   at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
   at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:215)
   at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:368)
   at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:280)
   at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:597)
   at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:93)
   at org.hibernate.proxy.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:42)
   at org.hibernate.tuple.PojoTuplizer.buildProxyFactory(PojoTuplizer.java:138)
   at org.hibernate.tuple.AbstractTuplizer.<init>(AbstractTuplizer.java:83)
   at org.hibernate.tuple.PojoTuplizer.<init>(PojoTuplizer.java:53)
   at org.hibernate.tuple.TuplizerLookup.create(TuplizerLookup.java:45)
   at org.hibernate.tuple.EntityMetamodel.<init>(EntityMetamodel.java:208)
   at org.hibernate.persister.entity.BasicEntityPersister.<init>(BasicEntityPersister.java:398)
   at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:104)
   at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
   at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:199)
   at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1043)
   at persistence.PersistenceManager.<init>(PersistenceManager.java:13)
   at persistence.ConnectionTest.main(ConnectionTest.java:20)
1737 [main] WARN org.hibernate.tuple.PojoTuplizer  - could not create proxy factory for:forum.Forum
org.hibernate.HibernateException: CGLIB Enhancement failed: forum.Forum
   at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:107)
   at org.hibernate.proxy.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:42)
   at org.hibernate.tuple.PojoTuplizer.buildProxyFactory(PojoTuplizer.java:138)
   at org.hibernate.tuple.AbstractTuplizer.<init>(AbstractTuplizer.java:83)
   at org.hibernate.tuple.PojoTuplizer.<init>(PojoTuplizer.java:53)
   at org.hibernate.tuple.TuplizerLookup.create(TuplizerLookup.java:45)
   at org.hibernate.tuple.EntityMetamodel.<init>(EntityMetamodel.java:208)
   at org.hibernate.persister.entity.BasicEntityPersister.<init>(BasicEntityPersister.java:398)
   at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:104)
   at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
   at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:199)
   at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1043)
   at persistence.PersistenceManager.<init>(PersistenceManager.java:13)
   at persistence.ConnectionTest.main(ConnectionTest.java:20)
Caused by: java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
   at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:783)
   at net.sf.cglib.proxy.Enhancer.emit(Enhancer.java:749)
   at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:481)
   at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
   at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:215)
   at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:368)
   at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:280)
   at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:597)
   at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:93)
   ... 13 more



Thanks

Mirko


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 16, 2005 5:49 pm 
Regular
Regular

Joined: Wed Nov 17, 2004 11:49 am
Posts: 65
Location: Pittsburgh
I am having a very similar problem and my class does indeed have a public constructor.

findById just does a session.get(Statement.class, primaryKey);

java.lang.NullPointerException at org.hibernate.tuple.AbstractTuplizer.createProxy(AbstractTuplizer.java:249) at org.hibernate.persister.entity.BasicEntityPersister.createProxy(BasicEntityPersister.java:2801) at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:242) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:123) at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:593) at org.hibernate.type.ManyToOneType.resolveIdentifier(ManyToOneType.java:73) at org.hibernate.type.EntityType.resolve(EntityType.java:264) at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:105) at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:452) at org.hibernate.loader.Loader.doQuery(Loader.java:406) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:203) at org.hibernate.loader.Loader.loadEntity(Loader.java:1255) at org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:139) at org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:124) at org.hibernate.loader.entity.BatchingEntityLoader.load(BatchingEntityLoader.java:81) at org.hibernate.persister.entity.BasicEntityPersister.load(BasicEntityPersister.java:2453) at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:387) at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:368) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:166) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:140) at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:249) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:123) at org.hibernate.impl.SessionImpl.get(SessionImpl.java:561) at org.hibernate.impl.SessionImpl.get(SessionImpl.java:556) at com.chessys.bankanalysis.statement.persistence.Statement.findById(Statement.java:675) at


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 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.