hibrnate教程7~一对多的关系解析

首先准备两个实体类:employees和department

employees多对一department,所以用到的是onetomany和manytoone

关系映射主要是在配置文件上多以重点关注配置文件的配置属性

首先创建实体类

/**
 * 部门
 *
 * @author tyg
 *
 */
public class Department {
    private Integer id;
    private String name;

    private Set<Employee> employees = new HashSet<Employee>(); // 关联的很多员工

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Employee> getEmployees() {
        return employees;
    }

    public void setEmployees(Set<Employee> employees) {
        this.employees = employees;
    }

    @Override
    public String toString() {
        return "[Department: id=" + id + ", name=" + name + "]";
    }

}
}

员工实体类

package cn.itcast.f_hbm_oneToMany;

/**
 * 员工
 *
 * @author tyg
 *
 */
public class Employee {
    private Integer id;
    private String name;

    private Department department; // 关联的部门对象

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    @Override
    public String toString() {
        return "[Employee: id=" + id + ", name=" + name + "]";
    }
}

 第二步,写demparment和employees的配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.itcast.f_hbm_oneToMany">

    <class name="Department" table="department">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name"/>

        <!-- employees属性,Set集合,表达的是本类与Employee的一对多 
            class属性:关联的实体类型
            key子元素:对方表中的外键列(多方的那个表)
            
            inverse属性:
                默认为false,表示本方维护关联关系。
                如果为true,表示本方不维护关联关系。
                只是影响是否能设置外键列的值(设成有效值或是null值),对获取信息没有影响。
                
            cascade属性:
                默认为none,代表不级联。
                级联是指操作主对象时,对关联的对象也做相同的操作。
                可设为:delete, save-update, all, none ...-->
        <set name="employees" cascade="all">
            <key column="departmentId"></key>
            <one-to-many class="Employee"/>
        </set>


    </class>

</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.itcast.f_hbm_oneToMany">

    <class name="Employee" table="employee">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name" type="string" column="name"/>

        <!-- department属性,表达的是本类与Department的多对一 
            class属性:关联的实体类型
            column属性:外键列(引用关联对象的表的主键)
        -->
        <many-to-one name="department" class="Department" column="departmentId"></many-to-one>

    </class>

</hibernate-mapping>

最后一步进行测试环节:

以保存为例,主要是分为五步来

1.创建session

2.给session配置属性

3.创建存入对象

4.给对象建关联关系

5.保存对象

6.提交事务,关闭session

private static SessionFactory sessionFactory = new Configuration()//
        .configure()//
        .addClass(Department.class)// 添加Hibernate实体类(加载对应的映射文件)
        .addClass(Employee.class)// 添加Hibernate实体类(加载对应的映射文件)
        .buildSessionFactory();

// 保存,有关联关系
@Test
public void testSave() throws Exception {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // --------------------------------------------

        // 新建对象
        Department department = new Department();
        department.setName("开发部");

        Employee employee1 = new Employee();
        employee1.setName("张三");

        Employee employee2 = new Employee();
        employee2.setName("李四");

        // 关联起来
        employee1.setDepartment(department);
        employee2.setDepartment(department);
        department.getEmployees().add(employee1);
        department.getEmployees().add(employee2);

        // 保存
//    session.save(employee1);
//    session.save(employee2);
        session.save(department); // 保存部门

        // --------------------------------------------
        session.getTransaction().commit();
        session.close();
        }

下面是获取关联对象,删除关联对象,接触关联关系的测试类代码

// 获取,可以获取到关联的对方
@Test
public void testGet() throws Exception {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // --------------------------------------------

        // 获取一方,并显示另一方信息
        Department department = (Department) session.get(Department.class, 1);
        System.out.println(department);
        System.out.println(department.getEmployees());

        // Employee employee = (Employee) session.get(Employee.class, 1);
        // System.out.println(employee);
        // System.out.println(employee.getDepartment());

        // --------------------------------------------
        session.getTransaction().commit();
        session.close();
        }

// 解除关联关系
@Test
public void testRemoveRelation() throws Exception {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // --------------------------------------------

        // // 从员工方解除
        // Employee employee = (Employee) session.get(Employee.class, 1);
        // employee.setDepartment(null);

        // 从部门方解除(与inverse有关系,为false时可以解除)
        Department department = (Department) session.get(Department.class, 1);
        department.getEmployees().clear();

        // --------------------------------------------
        session.getTransaction().commit();
        session.close();
        }

// 删除对象,对关联对象的影响
@Test
public void testDelete() throws Exception {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        // --------------------------------------------

        // // 删除员工方(多方),对对方没有影响
        // Employee employee = (Employee) session.get(Employee.class,2);
        // session.delete(employee);

        // 删除部门方(一方)
        // a, 如果没有关联的员工:能删除。
        // b, 如果有关联的员工且inverse=true,由于不能维护关联关系,所以会直接执行删除,就会有异常
        // c, 如果有关联的员工且inverse=false,由于可以维护关联关系,他就会先把关联的员工的外键列设为null值,再删除自己。
        Department department = (Department) session.get(Department.class, 4);
        session.delete(department);

        // --------------------------------------------
        session.getTransaction().commit();
        session.close();
        }
 
 

end《===

猜你喜欢

转载自blog.csdn.net/weixin_41904221/article/details/80872220