Hibernate 基于关联关系的增删改操作

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);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值