hibernate中采用joined-subclass映射策略时,子类实例与父类共有的属性保存在父类表中,而子类增加的属性保存在子类表中。现在我想要把子类实例与父类共有的部分属性同时保存在子类表中,请问应该怎么做?比如:父类Employee , 有id、name、salary、manager 属性子类Manager,有id、name、salary、manager、department属性,其中department是新增属性正常情况下,使用joined-subclass映射策略时,Manager表只会出现id和department列,现在我用sql语句创建了表Manager,是有id、name、manager、department列的,应该怎么配置hbm.xml文件,使得保存Manager类时,既在Employee表增加记录,又在Manager表增加包含name和manager字段的记录?
<hibernate-mapping package="entity">
<class name="Vehicle">
<id name="oid">
<generator class="increment" />
</id> <discriminator column="Type" /> <property name="speed" not-null="true" /> <property name="carry" not-null="true" /> <subclass name="Car" discriminator-value="c">
<property name="wheel" />
</subclass> <subclass name="Train" discriminator-value="t">
<property name="node" />
</subclass>
</class>
</hibernate-mapping>
要求是用joined-subclass
父类Employee , 有id、name、salary、manager 属性 子类Manager,有Managerid(主键),Employeeid(外键)、department属性,其中department是新增属性 。参考:
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hiber"> <class name="User" table="user">
<id name="id" column="user_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<many-to-one name="room" column="ROOM_ID" class="Room" cascade="all" unique="true"/>
</class> </hibernate-mapping> Room.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hiber"> <class name="Room" table="room">
<id name="id" column="room_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="address" column="address" type="string"></property>
<one-to-one name="user" class="User" property-ref="room"></one-to-one>
</class>
</hibernate-mapping> 另外一种方式是一对一的主键关联。限制兩各数据表的主键使用相同的值,如此一个User与Room就是一对一关系。如图:
hibernate的配置文件如下 User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hiber"> <class name="User" table="user">
<id name="id" column="user_id" unsaved-value="0">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<one-to-one name="room" class="Room" cascade="all"></one-to-one>
</class> </hibernate-mapping> Room.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hiber"> <class name="Room" table="room">
<id name="id" column="room_id" unsaved-value="0">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<property name="address" column="address" type="string"></property>
<one-to-one name="user" class="User" constrained="true"></one-to-one>
</class>
</hibernate-mapping> 后者只能实现主键的1对1共享
Emp_table:
id name salary manager Mgr_table:
id name manager department我是设计Employee类和Manager类,后者继承前者,是双向N-1关联。
两个类的属性分别为:
class Employee{
int id;
string name;
double salary;
Manager manager;
....//省略成员方法
}
class Manager extends Employee{
string department;
Set<Employee> employees;
....//省略成员方法
}
两者是用joined-subclass策略相连,也就是Mgr_table表的记录在Emp_table也有,现在希望在保存Manager对象的时候,在两个表都添加记录。应该怎么映射Manager的name和manager 列?
http://esffor.javaeye.com/blog/96324
这个例子跟我的问题不太一样,他的父类Container是个抽象类,在hbm.xml里不用配置,我的Employee类需要在hbm.xml里配置,Manager类的映射需要依靠Employee.hbm.xml