Hibernate 是一个面向对象的持久化框架,其基于关联关系的增删改操作需要从对象的两端进行
Hibernate 基于关联关系的增删改操作主要包括如下几个方面
- 在one方添加数据
- 在many方添加数据
- 在many方删除数据
- 修改关联关系 (的inverse属性 设置更新主控方)
- 在one方删除数据(的cascade属性 级联操作)
下面我们逐一对以上进行分析
1.在one方添加数据 — 对于关联关系无明显影响只需要进行 ONE 方操作即可
/** * ONE 方增加数据不需要对关联属性进行特别设定 * Department department = new Department(); * deparement.setDepartmentName("动力部"); * @param department */ public void addDepartment(Department department) { super.add(department); }
2.在many方添加数据 — 添加新的雇员需要注意:新雇员需要设设定 雇员姓名 雇员所属部门(关联对象)
public class Tester { /** * 测试 添加新雇员的操作 * 雇员姓名:王华 * 雇员部门:计划部 * @param args */ public static void main(String[] args) { HrDAO dao = new HrDAO(); //新建雇员对象 Employee employee = new Employee(); //雇员姓名装入 employee.setEmployeeName("王华"); //取得 计划部 的部门对象 并装入雇员对象 List<Department> list = dao.getDepartmentList(); for(Department department:list) { if (department.getDepartmentName().equals("计划部")) { employee.setDepartment(department); break; } } dao.addEmployee(employee); } }
3.在many方删除数据 — 对于关联关系无明显影响只需要进行 many 方操作即可
public class Tester2 { /** * 测试 删除雇员的操作 * 雇员姓名:王华 * @param args */ public static void main(String[] args) { HrDAO dao = new HrDAO(); //新建雇员对象 Employee employee = null; //根据雇员姓名装入雇员 List<Employee> list = dao.getEmployeeList(); for(Employee e:list) { if (e.getEmployeeName().equals("王华")) { employee = e; break; } } //执行删除 dao.delEmployee(employee.getEmployeeId()); } }
4.修改关联关系 (的inverse属性 设置更新主控方)
注意:在 one-to-many 双向关联关系中,一般我们将 many 方设置为主控方 one 方为被控方(inverse=’true’)
public class Tester3 { /** * 测试 更新雇员 王五 的部门信息 * 雇员姓名:王五 * 原始部门:财务部 * 新至部门:制造部 * @param args */ public static void main(String[] args) { HrDAO dao = new HrDAO(); //获得雇员对象 Employee employee = null; //根据雇员姓名装入雇员 List<Employee> list = dao.getEmployeeList(); for(Employee e:list) { if (e.getEmployeeName().equals("王五")) { employee = e; break; } } //获得 财务部 制造部 对象 Department caiwuDepart = null ,zhizaoDepart = null; //根据部门名称装入部门对象 List<Department> depList = dao.getDepartmentList(); boolean f1 = false , f2 = false; for(Department d:depList) { if (d.getDepartmentName().equals("财务部")) { caiwuDepart = d; f1 = true; } if (d.getDepartmentName().equals("制造部")) { zhizaoDepart = d; f2 = true; } if (f1 && f2) { break; } } //1.财务部中删除雇员王华的信息 caiwuDepart.getEmployees().remove(employee); //2.制造部中添加雇员王华的信息 zhizaoDepart.getEmployees().add(employee); //2.更新雇员所属部门信息 employee.setDepartment(zhizaoDepart); //更新数据库 dao.updateEmployee(employee); } }
在以上的例子中:
ONE :财务部对象移除雇员 – 制造部对象增加雇员 的操作是没有意义的!
但是这样逻辑上保证了对象,关系数据库模型的统一性。并且在实际应用中如果部门信息并不是直接有数据库中取出,而是由其他瞬时作用域中得到的话,其操作就具有了实际的保证数据一致性的意义!
5.在one方删除数据(的cascade属性 级联操作)
如果在 ONE 方删除数据,MANY 方相关数据不是就会出现无效数据了吗?
解决方案是在 ONE 方 实体配置文件,关联属性中增加 cascade 属性
<hibernate-mapping> <class name="cn.net.royakon.entity.Department" table="department" catalog="hrdb"> <id name="departmentId" type="java.lang.Integer"> <column name="department_id" /> <generator class="identity" /> </id> <property name="departmentName" type="java.lang.String"> <column name="department_name" length="50" not-null="true" /> </property> <!-- 增加 cascade="all" 属性 所有的 ONE方操作均导致级联更新 --> <set name="employees" inverse="true" cascade="all"> <key> <column name="employee_department" not-null="true" /> </key> <one-to-many class="cn.net.royakon.entity.Employee" /> </set> </class> </hibernate-mapping>
public class Tester4 { /** * 测试 删除 财务部 * @param args */ public static void main(String[] args) { HrDAO dao = new HrDAO(); //获得 财务部 对象 Department caiwuDepart = null; //根据部门名称装入部门对象 List<Department> depList = dao.getDepartmentList(); for(Department d:depList) { if (d.getDepartmentName().equals("财务部")) { caiwuDepart = d; break; } } //从数据库中删除 dao.delDepartment(caiwuDepart); } }
Categories: 网页编程