Note that there are some explanatory texts on larger screens.

plurals
  1. POSplitting Hibernate Entity among 2 Tables
    text
    copied!<p>I have a simple Class Hierarchy that I am trying to get to work with Hibernate/JPA.</p> <p>Basically what I want is for the MovementData to be in its own Table with a FK to the integer id of the Main Vehicle Table in the Database.</p> <p>Am I doing something wrong? How else can I accomplish something similar? I am pretty sure I am following the JPA spec. (EJB3 In Action says this should work: <a href="http://books.google.com/books?id=j4Qf2iLL488C&amp;pg=PA266&amp;vq=%40secondarytable&amp;dq=ejb3+in+action&amp;source=gbs_search_s&amp;cad=0" rel="nofollow noreferrer">EJB3 In Action: @SecondaryTable</a></p> <p>Here is a portion of the exception I am getting:</p> <pre><code>SEVERE: 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 MOVEMENT_DATA not found at org.hibernate.persister.entity.JoinedSubclassEntityPersister.getTableId(JoinedSubclassEntityPersister.java:480) at org.hibernate.persister.entity.JoinedSubclassEntityPersister.&lt;init&gt;(JoinedSubclassEntityPersister.java:259) at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:87) at org.hibernate.impl.SessionFactoryImpl.&lt;init&gt;(SessionFactoryImpl.java:261) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327) </code></pre> <p>Here is some of the logging info from Hibernate that pertains to the Vehicle... It looks like it is recognizing everything fine.. Then it throws the exception for some reason.</p> <pre><code>INFO: Binding entity from annotated class: com.dataobject.Vehicle FINE: Import with entity name Vehicle INFO: Bind entity com.dataobject.Vehicle on table VEHICLE INFO: Adding secondary table to entity com.dataobject.Vehicle -&gt; MOVEMENT_DATA FINE: Processing com.dataobject.Vehicle property annotation FINE: Processing annotations of com.dataobject.Vehicle.id FINE: Binding column id. Unique false. Nullable false. FINE: id is an id FINE: building SimpleValue for id FINE: Building property id FINEST: Cascading id with null FINE: Bind @Id on id FINE: Processing annotations of com.dataobject.Vehicle.color FINE: Binding column COLOR. Unique false. Nullable true. FINE: binding property color with lazy=false FINE: building SimpleValue for color FINE: Building property color FINEST: Cascading color with null FINE: Processing annotations of com.dataobject.Vehicle.movementData FINE: Binding column movementData. Unique false. Nullable true. FINE: Binding component with path: com.dataobject.Vehicle.movementData FINE: Processing com.dataobject.MovementData property annotation FINE: Processing annotations of com.dataobject.MovementData.latitude FINE: Column(s) overridden for property latitude FINE: Binding column LATITUDE. Unique false. Nullable true. FINE: binding property latitude with lazy=false FINE: building SimpleValue for latitude FINE: Building property latitude FINEST: Cascading latitude with null FINE: Processing annotations of com.dataobject.MovementData.longitude FINE: Column(s) overridden for property longitude FINE: Binding column LONGITUDE. Unique false. Nullable true. FINE: binding property longitude with lazy=false FINE: building SimpleValue for longitude FINE: Building property longitude FINEST: Cascading longitude with null FINE: Processing annotations of com.dataobject.MovementData.speed FINE: Column(s) overridden for property speed FINE: Binding column SPEED. Unique false. Nullable true. FINE: binding property speed with lazy=false FINE: building SimpleValue for speed FINE: Building property speed FINEST: Cascading speed with null FINE: Processing annotations of com.dataobject.MovementData.timeOfPosition FINE: Column(s) overridden for property timeOfPosition FINE: Binding column TIME_OF_POSITION. Unique false. Nullable true. FINE: binding property timeOfPosition with lazy=false FINE: building SimpleValue for timeOfPosition FINE: Building property timeOfPosition FINEST: Cascading timeOfPosition with null FINE: Building property movementData FINEST: Cascading movementData with null FINE: Processing annotations of com.dataobject.Vehicle.numWheels FINE: Binding column NUM_WHEELS. Unique false. Nullable true. FINE: binding property numWheels with lazy=false FINE: building SimpleValue for numWheels FINE: Building property numWheels FINEST: Cascading numWheels with null INFO: Binding entity from annotated class: com.dataobject.Car FINE: Binding column id. Unique false. Nullable false. FINE: Subclass joined column(s) created FINE: Import with entity name Car INFO: Bind entity com.dataobject.Car on table CAR FINE: Processing com.dataobject.Car property annotation FINE: Processing annotations of com.dataobject.Car.make FINE: Binding column MAKE. Unique false. Nullable true. FINE: binding property make with lazy=false FINE: building SimpleValue for make FINE: Building property make </code></pre> <p><strong>Vehicle is the Parent Class</strong></p> <pre><code>/** * Entity implementation class for Entity: Vehicle * */ @Entity @Table(name="VEHICLE") @Inheritance(strategy=InheritanceType.JOINED) @SecondaryTable(name="MOVEMENT_DATA", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "ID") } ) public class Vehicle implements Serializable { private int numWheels; private String color; private int id; private MovementData movementData; private static final long serialVersionUID = 1L; public Vehicle() { super(); } @Embedded @AttributeOverrides( { @AttributeOverride( name = "speed", column = @Column(name = "SPEED", table = "MOVEMENT_DATA") ), @AttributeOverride( name = "timeOfPosition", column = @Column(name = "TIME_OF_POSITION", table = "MOVEMENT_DATA") ), @AttributeOverride( name = "longitude", column = @Column(name = "LONGITUDE", table = "MOVEMENT_DATA") ), @AttributeOverride( name = "latitude", column = @Column(name = "LATITUDE", table = "MOVEMENT_DATA") ) }) public MovementData getMovementData() { return movementData; } public void setMovementData(MovementData movementData) { this.movementData = movementData; } @Column(name="NUM_WHEELS") public int getNumWheels() { return this.numWheels; } public void setNumWheels(int numWheels) { this.numWheels = numWheels; } @Column(name="COLOR") public String getColor() { return this.color; } public void setColor(String color) { this.color = color; } @Id public int getId() { return this.id; } public void setId(int id) { this.id = id; } } </code></pre> <p><strong>Car extends Vehicle</strong></p> <pre><code>/** * Entity implementation class for Entity: Car */ @Entity @Table(name="CAR") public class Car extends Vehicle implements Serializable { private String make; private static final long serialVersionUID = 1L; public Car() { super(); } /** * @return */ @Column(name="MAKE") public String getMake() { return this.make; } /** * @param make */ public void setMake(String make) { this.make = make; } } </code></pre> <p><strong>MovementData is Embedded in Vehicle</strong></p> <pre><code>@Embeddable public class MovementData implements Serializable { private double speed; private Date timeOfPosition; private double latitude; private double longitude; private static final long serialVersionUID = 1L; public MovementData() { super(); } /** * @return */ @Column(name="SPEED") public double getSpeed() { return this.speed; } /** * @param speed */ public void setSpeed(double speed) { this.speed = speed; } /** * @return */ @Column(name="TIME_OF_POSITION") public Date getTimeOfPosition() { return this.timeOfPosition; } /** * @param timeOfPosition */ public void setTimeOfPosition(Date timeOfPosition) { this.timeOfPosition = timeOfPosition; } /** * @return */ @Column(name="LONGITUDE") public double getLongitude() { return this.longitude; } /** * @param longitude */ public void setLongitude(double longitude) { this.longitude = longitude; } /** * @return */ @Column(name="LATITUDE") public double getLatitude() { return this.latitude; } /** * @param latitude */ public void setLatitude(double latitude) { this.latitude = latitude; } } </code></pre> <p><strong>Persistence Unit:</strong></p> <pre><code> &lt;properties&gt; &lt;!-- The database dialect to use --&gt; &lt;property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /&gt; &lt;!-- drop and create tables at deployment --&gt; &lt;property name="hibernate.hbm2ddl.auto" value="create-drop" /&gt; &lt;!-- Hibernate Query Language (HQL) parser. --&gt; &lt;!-- property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /--&gt; &lt;!-- property name="hibernate.cache.provider_class" value="org.hibernate.cache.JbossCacheProvider" /--&gt; &lt;property name ="hibernate.show_sql" value="false" /&gt; &lt;property name ="hibernate.format_sql" value="false" /&gt; &lt;property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider" /&gt; &lt;/properties&gt; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload