[jboss-user] [EJB 3.0] - WrongClassException with inheritance

hamtho2 do-not-reply at jboss.com
Tue Jan 9 04:46:34 EST 2007


Hi,

I have a problem with an inheritance-model and I´m not sure, if I´m trying to do something, that´s not possible this way. From the object-oriented point of view and the database-oriented point of view this should be possible, but it seems, as if ejb3 needs some more information.

The object inheritance looks like this:


  |                       AbstractBalance
  |                               A
  |                               |
  |                               |
  |         +---------------------+-------------------------+
  |         |                                               |
  |    BalanceA                                          BalanceB
  | 

an it should be realized through a InheritanceType.JOINED with the following database-tables all referencing to the same id:


CREATE TABLE balance
  | (
  | 	id INTEGER NOT NULL,
  | 	code_currency VARCHAR(3) NOT NULL
  | );
  | 
  | CREATE TABLE balance_a
  | (
  | 	id INTEGER NOT NULL,
  | 	credit NUMERIC(10, 2) NOT NULL
  | );
  | 
  | ALTER TABLE balance_a ADD CONSTRAINT pk_balance_a
  | 	PRIMARY KEY (id);
  | 
  | ALTER TABLE balance_a ADD CONSTRAINT fk__balance_a
  | 	FOREIGN KEY (id) REFERENCES balance (id) ON DELETE NO ACTION;
  | 
  | CREATE TABLE balance_b
  | (
  | 	id INTEGER NOT NULL,
  | 	income NUMERIC(10, 2) NOT NULL
  | );
  | 
  | ALTER TABLE balance_b ADD CONSTRAINT fk__balance_b
  | 	FOREIGN KEY (id) REFERENCES balance (id) ON DELETE NO ACTION;
  | 

and these annotations:


  | @Entity
  | @Table(name = "balance")
  | @Inheritance(strategy=InheritanceType.JOINED)
  | public abstract class Balance implements Serializable {
  | 
  |     @Id
  |     @Column(name = "id", nullable = false)
  |     private Integer id;
  | 
  | ....
  | 
  | @Entity
  | @Table(name = "balance_a")
  | public class BalanceA extends Balance implements Serializable {
  | 
  | ....
  | 
  | @Entity
  | @Table(name = "balance_b")
  | public class BalanceB extends Balance implements Serializable {
  | 
  | ....
  | 

The reason for that is, that I want to define values in the balance-table, that are necessary and identical for both of the subclasses. Unfortunately I get a WrongClassException when I try to load these classes from a referenced class and have the same id´s in every table. If I remove the referencing id in balance_b, everything works fine, although BalanceB is not reference.

10:03:30,617 INFO  [DefaultLoadEventListener] Error performing load command
  | org.hibernate.WrongClassException: Object with id: 2 was not of the specified subclass: entity.BalanceB (loaded object was of wrong class class entity.BalanceA)
  |         at org.hibernate.loader.Loader.instanceAlreadyLoaded(Loader.java:1234)
  |         at org.hibernate.loader.Loader.getRow(Loader.java:1186)
  |         at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:568)
  |         at org.hibernate.loader.Loader.doQuery(Loader.java:689)
  |         at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
  |         at org.hibernate.loader.Loader.loadEntity(Loader.java:1784)
  |         at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
  |         at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
  |         at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2977)
  |         at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:393)
  |         at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:374)
  |         at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:137)
  |         at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:193)
  |         at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:101)
  |         at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
  |         at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:846)
  |         at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
  |         at org.hibernate.type.EntityType.resolve(EntityType.java:303)
  |         at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
  |         at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
  | 

Did I miss anything in the annotation or is it not possible to do it that way?

Thank you very much for your help

Thomas

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3999368#3999368

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3999368




More information about the jboss-user mailing list