@OneToMany using @JoinTable with Joined Inheritance
ariggz May 22, 2006 3:53 PMI have experence a problem while mapping a legacy database when I am attempt to use @ManyToOne using @JoinTable and the parent class is declaired with @Inheritance(strategy=InheritanceType.JOINED). Here is a simplified version of what I am attempting:
@Entity @Inheritance(strategy=InheritanceType.JOINED) @Table(name = "baseclass") public abstract class Baseclass implements java.io.Serializable { private String internalid; @Id @Column(name = "INTERNALID", unique = true, nullable = false, insertable = true, updatable = true, length = 34) public String getInternalid() { return this.internalid; } public void setInternalid(String internalid) { this.internalid = internalid; } }
@Entity @Table(name = "parent") public class Parent extends Baseclass { private String name; public String getName(){ return this.name; } public void setName(String name){ this.name = name; } }
@Entity @Table(name = "child") public class Child implements java.io.Serializable { private String internalid; private String name; private Parent parent; @Id @Column(name = "INTERNALID", unique = true, nullable = false, insertable = true, updatable = true, length = 34) public String getInternalid() { return this.internalid; } public void setInternalid(String internalid) { this.internalid = internalid; } public String getName(){ return this.name; } public void setName(String name){ this.name = name; } @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinTable(name="hierarchy", joinColumns = @JoinColumn( name="childinternalid"), inverseJoinColumns = @JoinColumn( name="parentinternalid")) public Parent getParent(){ return this.parent; } public void setParent(Parent parent){ this.parent = parent; } }
When I try this in JBOSSAS4.0.4GA I receive the following error:
14:24:09,268 ERROR [AssertionFailure] an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session) org.hibernate.AssertionFailure: Table hierarchy not found at org.hibernate.persister.entity.JoinedSubclassEntityPersister.getTableId(JoinedSubclassEntityPersister.java:444) at org.hibernate.persister.entity.JoinedSubclassEntityPersister.<init>(JoinedSubclassEntityPersister.java:225) at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:58) at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:223) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1213) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:631) at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:760) at org.hibernate.ejb.Ejb3Configuration.createContainerEntityManagerFactory(Ejb3Configuration.java:350) at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:119) at org.jboss.ejb3.entity.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:264) 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:585) ...
If I switch the association to @OneToMany on the parent side there is no error.
I have also experenced this same error using bidirectional @OneToOne with an association table where either end is using @Inheritance(strategy=InheritanceType.JOINED), and if I make it unidirectional on the end without @Inheritance(strategy=InheritanceType.JOINED) it does not throw the error.
I'm not sure what I am doing wrong, and thanks for all the help this forum gives me.