我有以下類圖我想將它映射到數據庫(請注意,人有一個與Vehicle類的對象列表)。 休眠映射與一對多的多態關係
而且我數據庫樣子:
在數據庫中代表的汽車類的子類有超車輛的所有領域的所有表。此外,所有的關係都顯示了人與車,汽車和摩托車之間的一對多關係。
我Hibernate映射文件如下: Person.hbm.xml
<hibernate-mapping package="....">
<class name="Person" table="Persons">
<id name="key" column="Person_ID">
<generator class="native"/>
</id>
<list name="ownedVehicles" inverse="false" cascade="all">
<key column="Person_ID" not-null="true" />
<list-index column="idx"/>
<one-to-many class="Vehicle"/>
</list>
</class>
</hibernate-mapping>
Vehicle.hbm.xml
<hibernate-mapping package="...">
<class name="Vehicle" table="Vehicles" polymorphism="implicit">
<id name="id" type="int" column="Vehicle_ID">
<generator class="increment"/>
</id>
<property name="numOfSeats"/>
<union-subclass name="Car" table="Cars"></union-subclass>
<union-subclass name="Motorcycle" table="Motorcycles"></union-subclass>
</class>
</hibernate-mapping>
的問題(錯誤我得到)如下:
Hibernate: insert into Persons (Person_ID) values (default)
2013-06-26 15:41:52 WARN JdbcCoordinatorImpl:424 - HHH000386: ResultSet had no statement associated with it, but was not yet registered
Hibernate: update Car set numOfSeats=? where Vehicle_ID=?
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
我得到這個錯誤,當我運行:
Car car = new Car();
car.setNumOfSeats(5);
Person person = new Person();
person.getOwnedVehicles().add(car);
ManagePerson managePerson = new ManagePerson();
Integer personID = managePerson.store(person);
的店() ManagePerson的功能實際上是創建一個會話和交易,然後使用保存()由Hibernate提供方法將對象保存到數據庫中。
就我所知,Hibernate通常會插入到人員中,然後插入到汽車中,最後更新汽車(更新完成後將汽車表上的外鍵保存爲引用擁有汽車的人員)。然而,在這種情況下並非如此,插入Cars似乎正在被跳過。通過在上面給出的代碼上嘗試person.getOwnedVehicles().add(vehicle);
而不是person.getOwnedVehicles().add(car);
,我明白了Hibernate是如何工作的。
正如你可能知道的,我試圖看看Hibernate是否真正理解在哪個「子類」表中記錄應該去,這取決於Person類的ownedVehicle列表中包含的對象的類。例如,如果擁有的車輛擁有Car類和Motorcycle類的對象,那麼它們中的每一個都應該分別到汽車和摩托車表中。
注意:我正在使用Hibernate 4.2.2和HSQLDB 2.2.9。
我將不勝感激任何幫助。
謝謝。
謝謝你的答案@ador。我嘗試了你的建議,但無法使其工作。我花了太多時間讓它工作,所以我最終改變了它,並使用Table per子類策略,現在工作正常。我做的改變如下:將' '替換爲' joined-subclass>'。爲摩托車做同樣的事情。請注意,表示子類的表現在將只包含其字段的列,而不包含其超類的列。此外,子類不再需要FK。 –
Soc