【发布时间】:2013-06-26 16:36:33
【问题描述】:
我有以下类图,我想将其映射到数据库(请注意,Person 有一个包含 Vehicle 类对象的列表)。
我的 数据库 看起来像:
数据库中表示 Vehicle 类的子类的所有表都具有超类 Vehicle 的所有字段。此外,所有关系都显示了从人到车辆、汽车和摩托车的一对多关系。
我的休眠映射文件如下: 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 的store() 函数实际上是创建一个会话和一个事务,然后使用Hibernate 提供的save() 方法将对象持久化到数据库中。
据我所知,Hibernate 通常会插入 Persons,然后插入 Cars,最后更新 Cars(更新是为了将外键保存在 Cars 表上,该表将引用拥有汽车的 Person)。但是,情况并非如此,插入 Cars 似乎被跳过了。我通过在上面给出的代码上尝试 person.getOwnedVehicles().add(vehicle); 而不是 person.getOwnedVehicles().add(car); 来了解 Hibernate 的工作原理。
正如您可能理解的那样,我试图查看 Hibernate 是否真正了解记录应该放在哪个“子类”表中,具体取决于 Person 类的ownedVehicle 列表中包含的对象的类。例如,如果ownedVehicles 有一个 Car 类对象和一个 Motorcycle 类对象,那么这些对象中的每一个都应该分别转到 Cars 和 Motorcycle 表。
注意:我使用的是 Hibernate 4.2.2 和 HSQLDB 2.2.9。
如果有任何帮助,我将不胜感激。
谢谢。
【问题讨论】:
标签: java hibernate data-binding one-to-many hibernate-mapping