Hibernate关联查询 一对多双向关联

Dept实体类

public class Dept {
    private Integer deptno;
    private String deptname;
    public Set<Emp> getEmps() {
        return emps;
    }

    public void setEmps(Set<Emp> emps) {
        this.emps = emps;
    }

    private Set<Emp> emps=new HashSet<Emp>();
    public Integer getDeptno() {
        return deptno;
    }

    public void setDeptno(Integer deptno) {
        this.deptno = deptno;
    }

    public String getDeptname() {
        return deptname;
    }

    public void setDeptname(String deptname) {
        this.deptname = deptname;
    }
}

Emp实体类

public class Emp {
    private Integer empno;
    private String empname;
    //植入部门单个对象
    private Dept dept;

    public Integer getEmpno() {
        return empno;
    }

    public void setEmpno(Integer empno) {
        this.empno = empno;
    }

    public String getEmpname() {
        return empname;
    }

    public void setEmpname(String empname) {
        this.empname = empname;
    }

    public Dept getDept() {
        return dept;
    }

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

Dept.hbm.xml小配置

<?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="cn.hibernate.day1228">
    <!--实体 name=实体端的内容   column=DB端的内容-->
    <class name="Dept" table="Dept" schema="zyx">
        <!--和底层数据表对应的主键   业务意义-->
        <id name="deptno" column="deptno">
            <!--主键生成策略 :assigned:程序员手动给值-->
            <generator class="native"/>
        </id>
        <property name="deptname" column="deptname"></property>
<!--   一对多 1个部门 多个员工-->
<set name="emps" cascade="save-update" inverse="true"> <key column="deptno"></key> <one-to-many class="Emp"></one-to-many> </set> </class> </hibernate-mapping>

Emp.hbm.xml小配置

<?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="cn.hibernate.day1228">
    <!--实体 name=实体端的内容   column=DB端的内容-->
    <class name="Emp" table="EMP" schema="zyx">
        <!--和底层数据表对应的主键   业务意义-->
        <id name="empno" column="empno">
            <!--主键生成策略 :assigned:程序员手动给值-->
            <generator class="native"/>
        </id>
        <property name="empname" column="empname"></property>
       <!-- 多对一 emp多的一方 dept一的一方
 name:再多的一方植入的一的一方的对象名
class:再多的一方植入的一德一方的类型名
column:在当前分析的对象对应的底层表的外列的值
--> <many-to-one name="dept" class="Dept" column="deptno"></many-to-one> </class> </hibernate-mapping>

hibernate.cfg.xml大配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <!--创建Session的基础配置-->
    <session-factory>
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
        <property name="connection.username">zyx</property>
        <property name="connection.password">zyx</property>
        <!-- SQL dialect (方言)-->
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <!-- Echo   all executed SQL to stdout 在控制台打印sql -->
        <property name="show_sql">true</property>
        <!--格式化SQL-->
        <property name="format_sql">true</property>
        <!-- Drop and re-create (重新创建)the database schema(架构) on startup (启动)
         是否根据hbm.xml自动建表 建表的策略 update create
        -->
        <property name="hbm2ddl.auto">update</property>
         <!--关联小配置 -->

        <mapping resource="cn/hibernate/day1228/Dept.hbm.xml"/>
        <mapping resource="cn/hibernate/day1228/Emp.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

测试

public class Test20171228sql {
    Configuration cfg;
    Session session;
    Transaction tx;
    SessionFactory factory;

    @Before
    public void myBefore(){
        //创建配置对象
        cfg=new Configuration().configure();
        // 2.根据配置对象创建SessionFactory
        factory=cfg.buildSessionFactory();
        //3.根据SessionFactory去创建Session
        session= factory.openSession();
        //3.5在Session创建后开启事务   xxx0001    xxxxx003
        tx= session.beginTransaction();
    }




    //关联查询  多对一单向关联
      @Test
    public void t5(){
        //提供一个员工的编号
          Emp emp=session.load(Emp.class,1);
          System.out.println(emp.getEmpname());
          //隶属的部门
          System.out.println(emp.getDept().getDeptname());
          tx.commit();
          session.close();

}


//添加部门的同时添加员工
    @Test
    public void t7(){
        Dept dept=new Dept();
        dept.setDeptname("nv部");
        Emp emp=new Emp();
        emp.setEmpname("666");
        emp.setDept(dept);
        //将部门的引入绑定到员工对象的一个属性上
        dept.getEmps().add(emp);
        session.save(dept);
        tx.commit();
    }
    //修改员工表的部门编号
    @Test
    public void t10(){
        Emp emp=(Emp)session.get(Emp.class,1);
        Dept dept=(Dept) session.get(Dept.class,1);
        emp.setDept(dept);
        tx.commit();
        session.close();
    }


//一队多双向关联
    @Test
    public void t6(){
//可以通过部门获取该部门下所有员工(因为设置了从部门到员工的一对多的关联)
        String hql="from Dept";
        Query query=session.createQuery(hql);
        List<Dept> list=query.list();
        for (Dept dept:list){
            System.out.println(dept.getDeptname()+"=============");
            //部门中有哪些员工
            for (Emp emp:dept.getEmps()){
                System.out.println(emp.getEmpname());
            }
            System.out.println("=========End================");
        }
        //可以通过某个员工获取该员工所在的部门(因为设置了从员工到部门的多对一的关联)
        Emp emp=session.load(Emp.class,1);
        System.out.println(emp.getDept().getDeptname());
        tx.commit();
        session.close();

    }

        }
原文地址:https://www.cnblogs.com/spghs/p/8136534.html