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字段的记录?

解决方案 »

  1.   


    <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>
      

  2.   

    用subclass策略的话就所有类都放到一个表了,我现在是想分Employee表和Manager表来放。
    要求是用joined-subclass
      

  3.   

    首先你的表结构设计不对应该是这样
    父类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共享
      

  4.   

    问题是。。表不是我设计的,已经被设计成为Emp_table表和Mgr_table表,表结构分别为:
    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 列?  
      

  5.   

    参考这个
    http://esffor.javaeye.com/blog/96324
      

  6.   


    这个例子跟我的问题不太一样,他的父类Container是个抽象类,在hbm.xml里不用配置,我的Employee类需要在hbm.xml里配置,Manager类的映射需要依靠Employee.hbm.xml