hibernate之初学一对多和多对一配置及使用

按查询及存取速率来说的一对多用的相对多对一少一些,这里只写主要配置文件的代码

首先是hibernate的配置文件

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
        <hibernate-configuration>
            <session-factory>
                <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
                <property name="hibernate.connection.url">jdbc:mysql:///webproject</property>
                <property name="hibernate.connection.username">root</property>
                <property name="hibernate.connection.password">123456</property>
                <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
                <property name="hibernate.show_sql">true</property>
                <property name="hibernate.hbm2ddl.auto">create</property>
                <mapping resource="com/shaoxin/entity/Dept.hbm.xml"/>
                <mapping resource="com/shaoxin/entity/Employee.hbm.xml"/>
            </session-factory>
        </hibernate-configuration>

一对多的配置文件代码,很明显使用到了set集合

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.shaoxin.entity">
        <class name="Dept" table="dept">
            <id name="deptid" column="deptid">
                <generator class="native"></generator>
            </id>
            <property name="deptName" column="deptname"></property><!--
            一对多设置外键方式,class代表外键类型
            --><set name="setEmployees" table="employee">
                <key column="dept_id"></key>
                <one-to-many class="Employee"/>
            </set>
        </class>
    </hibernate-mapping>

对应的实体类:

package com.shaoxin.entity;

import java.util.HashSet;
import java.util.Set;

public class Dept {
    private int deptid;
    private String deptName;
    private Set<Employee> setEmployees = new HashSet<Employee>();

    public int getDeptid() {
        return deptid;
    }

    public void setDeptid(int deptid) {
        this.deptid = deptid;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public Set<Employee> getSetEmployees() {
        return setEmployees;
    }

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

}

多对一的配置文件代码,很明显是一个对象类型

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.shaoxin.entity">
        <class name="Employee"  table="employee">
            <id name="employeeid" column="employeeid">
                <generator class="native"></generator>
            </id>
            <property name="employeeName" column="employeename"/><!--
            多对一创建外键方式:属性分别为:外键对应的表,外键字段,外键类型
            --><many-to-one name="dept" column="dept_id" class="Dept"></many-to-one>
        </class>
    </hibernate-mapping>

对应的实体类

package com.shaoxin.entity;

public class Employee {
    private int employeeid;
    private String employeeName;
    private Dept dept;

    public int getEmployeeid() {
        return employeeid;
    }

    public void setEmployeeid(int employeeid) {
        this.employeeid = employeeid;
    }

    public String getEmployeeName() {
        return employeeName;
    }

    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

}

测试这两个存储方式

package com.shaoxin.entity;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

public class TestMany2Many {
    static SessionFactory sf;
    static {
        sf = new Configuration().configure().buildSessionFactory();
    }

    @Test
    public void testOne2Many() throws Exception {
        Session openSession = sf.openSession();
        Transaction beginTransaction = openSession.beginTransaction();
        Employee empzs = new Employee();
        Employee empls = new Employee();
        empls.setEmployeeName("李四");
        empzs.setEmployeeName("张三");
        Dept dept = new Dept();
        dept.getSetEmployees().add(empls);
        dept.getSetEmployees().add(empzs);
        dept.setDeptName("应用开发");
        openSession.save(empls);
        openSession.save(empzs);
        openSession.save(dept);
        beginTransaction.commit();
        openSession.close();
    }

    @Test
    public void testMany2One() throws Exception {
        Session openSession = sf.openSession();
        Transaction beginTransaction = openSession.beginTransaction();
        Employee empzs = new Employee();
        Employee empls = new Employee();
        Dept dept = new Dept();
        dept.setDeptName("应用开发");
        empls.setEmployeeName("李四");
        empzs.setEmployeeName("张三");
        empls.setDept(dept);
        empzs.setDept(dept);
        openSession.save(dept);
        openSession.save(empls);
        openSession.save(empzs);
        beginTransaction.commit();
        openSession.close();
    }
}
时间: 2024-08-02 02:32:39

hibernate之初学一对多和多对一配置及使用的相关文章

Hibernate的集合一对多与多对一

需求:   部门与员工 一个部门有多个员工;       [一对多] 多个员工,属于一个部门    [多对一] 1.javaBean --Dept.java package com.gqx.onetomany; import java.util.HashSet; import java.util.Set; public class Dept { private int deptId; private String deptName; //部门对应的多个员工 (一对多) private Set<E

Hibernate实现双向一对多,多对一

人与电话号码是一对多 ,多对一的关系 @Entity @Table(name="tb_person") public class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String name; @OneToMany(mappedBy = "person") /*在双向一对多关系中 将控制权交给“多”方 */ private List&l

Hibernate中的一对多与多对一映射

1.需求 一个部门有多个员工;         [一对多] 多个员工,属于一个部门    [多对一] 2.实体Bean设计 Dept: public class Dept { private int depId; private String depName; private Set<Employee> emps = new HashSet<Employee>(); set... get... } Employee: public class Employee { private

Hibernate之实现一对多、多对一映射关联关系

一对多.多对一这种关系在现实生活中很多,例如部门与员工的关系,学校里班级与学生的关系... 那么在具体的系统实现中如果i实现这种关联关系呢?这里以部门和员工的关系为例. 部门实体类 package test.hibernate.hbmOneToMany; import java.util.HashSet; import java.util.Set; public class Department { private Integer id; private String name; private

Hibernate之关于一对多,多对一双向关联映射

[Hibernate]之关于一对多,多对一双向关联映射 由于一对多,和多对一的双向关联映射基本上一样,所以这里就一起写下来! Annotations配置 @Entity @Table(name="t_group") publicclass Group { private Integer id; private String name; private Set<Person> persons=newHashSet<Person>();//set不允许重复,最适合数

Hibernate 一对一、一对多、多对多注解属性的总结

mappedBy: 所填内容必为本类在另一方的字段名. 表示:本类放弃控制关联关系,所有对关联关系的控制,如:建立.解除与另一方的关系,都由对方控制,本类不管.举个例子: Teacher和Student之间是多对多关联关系,在Student端的teachers字段的@ManyToMany注解里面,配置属性mappedBy = "students".表示:学生没有资格控制与老师的关联关系(如:建立关系.删除关系),只有老师才有资格控制关联关系.学生不能说:"我们两做朋友吧&qu

三大框架 之 Hibernate查询(一对多、多对多、查询关系)

目录 一对多 表之间关系 表之间关系建表原则 一对多关系配置 建立表 建立ORM 添加配置文件 添加核心配置文件 引入工具类 编写测试类 级联操作 什么是级联 级联分类 级联是有方向性 级联保存或更新 级联删除 在双向级联的过程当中,会产生一些多余的sql语句 lazy懒加载(默认值是proxy,不自动获取外键对象) 级联保存或更新(解决 瞬时对象异常,只保存一边) 多对多 多对多关系配置 建立表 建立ORM 添加配置文件 在核心配置文件当中添加两个新配置 编写测试类 多对多的操作 查询方式 O

Hibernate中的一对多、多对多映射

一.一对多映射  如快递网点(ExpSite)与快递员(Deliver)的关系,即为一对多关系,一个快递网点有多个快递员,他们的关系如下图所示. 在一对多中,外键在多的一方 (1)在多的一方配置外键 Deliver表为多方,在Deliver实体类中放一个ExpSite方的引用做属性(外键),即所属网点ExpSiteId; Deliver实体类配置文件: <many-to-one name="ExpSiteId" class="ExpSite表所在的包名+ExpSite表

Hibernate 一对一、一对多、多对多注解cascade属性的总结

作用:是否级联被注解字段里面的对象.可选值:javax.persistence.CascadeType.PERSIST, MERGE, REMOVE, REFRESH, DETACH, ALL.可选其中的一个或多个,选一个时,花括号可用可不用. PERSIST 级联session的persist操作.假设Student类和teachers字段的@ManyToMany注解上配置有cascade = {CascadeType.PERSIST},那么,当stu1对象set了一个teachers集合(这