职位的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-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方控制的吧?),最好贴代码
|
|
还是不行。 前台过来的是HrDept的ID。 我应该将这个ID以哪种形式放在HrDept中呢??前辈 |
|
那个职位表的的set是关联另一个表的。三个表的关系是1、部门-职位:一对多;2、职位-员工:一对多; |
|
15分 |
那就是放对象,先根据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?
|