Code Bye

关于hibernate如何为一对多的表中添加数据。

 

职位的domain:

public class HrDuty implements java.io.Serializable {
        private BigDecimal dutyid;
	private HrDept hrDept;
	private String dutyname;
	getter and setter
}

部门的domain:

public class HrDept implements java.io.Serializable {
       private BigDecimal deptid;
	private String deptname;
	private Set hrDuties = new HashSet(0);
        getter and setter
}

部门和职位是一对多,现在我想向职位表中添加一条数据,该如何添加呢??直接用save的话会报错。
小弟初学hibernate,请高手赐教。

报什么错。如何配置的。
引用 1 楼 fangmingshijie 的回复:

报什么错。如何配置的。

部门表:

<hibernate-mapping>
    <class name="com.wyc.hr.domain.HrDept" table="HR_DEPT" schema="DB_HR" lazy="false">
        <comment>部门表</comment>
        <id name="deptid" type="java.math.BigDecimal">
            <column name="DEPTID" precision="22" scale="0" />
            <generator class="assigned" />
        </id>
        <property name="deptname" type="java.lang.String">
            <column name="DEPTNAME" length="20" />
        </property>
        <set name="hrEmployees" inverse="true">
            <key>
                <column name="EMPLOYEEDEPTID" precision="22" scale="0" />
            </key>
            <one-to-many class="com.wyc.hr.domain.HrEmployee" />
        </set>
        <set name="hrDuties" inverse="true">
            <key>
                <column name="DUTYDEPTID" precision="22" scale="0" />
            </key>
            <one-to-many class="com.wyc.hr.domain.HrDuty" />
        </set>
    </class>
</hibernate-mapping>

职位表:

<hibernate-mapping>
    <class name="com.wyc.hr.domain.HrDuty" table="HR_DUTY" schema="DB_HR" >
        <comment>职位表</comment>
        <id name="dutyid" type="java.math.BigDecimal">
            <column name="DUTYID" precision="22" scale="0" />
            <generator class="assigned" />
        </id>
        
        <many-to-one name="hrDept" class="com.wyc.hr.domain.HrDept" fetch="select">
            <column name="DUTYDEPTID" precision="22" scale="0" />
        </many-to-one>
        
        <property name="dutyname" type="java.lang.String">
            <column name="DUTYNAME" length="20" />
        </property>
        
        <set name="hrEmployees" inverse="true">
            <key>
                <column name="EMPLOYEEDUTYID" precision="22" scale="0" />
            </key>
            <one-to-many class="com.wyc.hr.domain.HrEmployee" />
        </set>
    </class>
</hibernate-mapping>

我的主要问题就是向‘private HrDept hrDept’;里面放什么值?因为前台过来的是一个数字。

去掉部门表里的inverse=”true”
一对多怎么两边都有set,职位表的set应该去了吧,还有inverse配在一边就可以了,默认是一方控制(反转2次后应该还是1方控制的吧?),最好贴代码
引用 3 楼 fangmingshijie 的回复:

去掉部门表里的inverse=”true”

还是不行。
java.lang.ClassCastException: java.lang.String cannot be cast to com.wyc.hr.domain.HrDept

前台过来的是HrDept的ID。

我应该将这个ID以哪种形式放在HrDept中呢??前辈

引用 4 楼 shxt_xiaozhi 的回复:

一对多怎么两边都有set,职位表的set应该去了吧,还有inverse配在一边就可以了,默认是一方控制(反转2次后应该还是1方控制的吧?),最好贴代码

那个职位表的的set是关联另一个表的。三个表的关系是1、部门-职位:一对多;2、职位-员工:一对多;
我想在想忘职位表中添加数据。但是在setHrDept()的时候,不知道该放什么值。前台传过来的是一个STRING,也就是部门的ID。


15分
引用 6 楼 tcwyc88 的回复:
Quote: 引用 4 楼 shxt_xiaozhi 的回复:

一对多怎么两边都有set,职位表的set应该去了吧,还有inverse配在一边就可以了,默认是一方控制(反转2次后应该还是1方控制的吧?),最好贴代码

那个职位表的的set是关联另一个表的。三个表的关系是1、部门-职位:一对多;2、职位-员工:一对多;
我想在想忘职位表中添加数据。但是在setHrDept()的时候,不知道该放什么值。前台传过来的是一个STRING,也就是部门的ID。

那就是放对象,先根据id get HrDept

引用 7 楼 shxt_xiaozhi 的回复:
Quote: 引用 6 楼 tcwyc88 的回复:
Quote: 引用 4 楼 shxt_xiaozhi 的回复:

一对多怎么两边都有set,职位表的set应该去了吧,还有inverse配在一边就可以了,默认是一方控制(反转2次后应该还是1方控制的吧?),最好贴代码

那个职位表的的set是关联另一个表的。三个表的关系是1、部门-职位:一对多;2、职位-员工:一对多;
我想在想忘职位表中添加数据。但是在setHrDept()的时候,不知道该放什么值。前台传过来的是一个STRING,也就是部门的ID。

那就是放对象,先根据id get HrDept

这样的话,是不是还要去数据库里去取这个记录呢??

是的,我感觉你把代码关键部分贴上来会好一些的

5分
设置inverse=”true”,由多的一段来来维护关系表

以Student(学生)和Class(班级)为例,它们之间的关系为一对多的关系,即一个学生只能属于一个班级,一个班级可以包含多个学生

 学生类定义代码:
Class Student{
  private int id;
  private String name;
  private Class class;
  //省略getter()和setter()方法
}
班级类定义代码:
Class Class{
  private int id;
  private String name;
  private Set students = new HashSet();
  //省略getter()和setter()方法
}
Student类的映射文件:
<class name="Student" table="STUDENT">
   <id name="id" type="int" column="ID">
      <generator class="native" />  
   </id>
   <property name="name" type="string" column="NAME" />
   <many-to-one name="class" column="CLASS_ID" class="Class" cascade="save-update" /> 
</class>
Class类的映射文件:
<class name="Class" table="CLASS">
   <id name="id" type="int" column="ID">
     <generator class="native" />  
   </id>
   <property name="name" type="string" column="NAME" />
   <set name="students" table="STUDENT" cascade="save-update" inverse="false">
     <key column="CLASS_ID" />
     <one-to-many class="Student" />
   </set>
</class>
希望你能对这两个映射文件所表达的数据库模式有正确的认识。即STUDENT表中存在一个名为CLASS_ID的字段,它和CLASS表中的ID字段是主外键关系。那个inverse属性就是用来规定是由谁(Student或Class)来维护这个主外键关系的。
inverse的默认值为false。
在处理逻辑代码中,如下:
Class c1 = new Class();
c1.setName("一班");
Student s1 = new Student();
Student s2 = new Student();
s1.setName("Jason");
s2.setName("Tom");
c1.getStudents().add(s1);
c2.getStudents().add(s2);
s1.setClass(c1);
s2.setClass(c1);   //注释1
session.save(c1);
简单的很 你把从表的当做属性来操作  然后通过属性.字段的形式来赋值就好了
这个问题我也遇到了,楼主现在是否应该解决了吧,解释下吧。折磨三天了
我为什么报错,class列名无效?Student类为什么定义private Class  class?

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于hibernate如何为一对多的表中添加数据。