首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hibernate一对多映射,保存一方,多方外键为null解决方法

2012-09-11 
hibernate一对多映射,保存一方,多方外键为null解决办法hibernate有很多关系映射,我就不给大家一一介绍了,

hibernate一对多映射,保存一方,多方外键为null解决办法
hibernate有很多关系映射,我就不给大家一一介绍了,下面是我主要解决一对多映射,保存一方时,多方的外键为null的解决办法。
我给大家写个部门和人员的例子。
保存时多方外键为null的代码如下:
一方:
public class Department {
private Integer deptId;
private String deptName;
private String location;
private Set<Employee> employees = new HashSet<Employee>();
        //set(),get()方法省略
}
多方:
public class Employee {
private Integer empId;
private String empName;
private Department department;
        //set(),get()方法省略
}
写的是xml配置文件
一方的映射文件:
...
<set name="employees" cascade="all" inverse="true">
<key column="deptId"></key>
<one-to-many cascade="all" column="deptId"></many-to-one>
...
大家可以看到我是把维护交给了多方。
下面是测试代码:
public static void main(String[] args) {
Session session = null;
Transaction transaction = null;

try {
session = HibUtil.getSession();
transaction = session.beginTransaction();

Department department = new Department();
department.setDeptName("技术部");
department.setLocation("海淀");

Employee employee = new Employee();
employee.setEmpName("张三");
Employee employee1 = new Employee();
employee.setEmpName("张三1");

department.getEmployees().add(employee);
department.getEmployees().add(employee1);
session.save(department);
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
}finally{
if(session!=null){
session.close();
}
}
}
这样测试的话多方的外键就为null了。我们一般认为这样是可以保存的,因为有级联么。但是我们又使用了inverse反向,所以问题就在这么,是我们测试的有问题。我们使用了inverse反向,下来就是多方(employee)来维护了。我们保存一方的时候,必须要让hibernate知道多方中有一方,这样才能保存一方时,多方会找到可保存的外键了。
所以大家只需要在上面测试代码中加入两行代码即可:
...
employee.setDepartment(department);
employee1.setDepartment(department);
...
这样就OK了,希望能帮到大家的忙。

热点排行