我有以下类图,我想将其映射到数据库(请注意,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>
车辆.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 列表中包含的对象的类。例如,如果 ownVehicles 有一个 Car 类对象和一个 Motorcycle 类对象,那么这些对象中的每一个都应该分别转到 Cars 和 Motorcycle 表。
注意:我使用的是 Hibernate 4.2.2 和 HSQLDB 2.2.9。
我将不胜感激。
谢谢。