zoukankan      html  css  js  c++  java
  • 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();
    
        }
    
            }
  • 相关阅读:
    iot 表索引dump《2》
    heap表和iot表排序规则不同
    Cannot complete the install because one or more required items could not be found.
    iot表输出按主键列排序,heap表不是
    iot 表主键存放所有数据,且按数据插入顺序排序
    iot表和heap表排序规则不同
    org.eclipse.graphiti.ui.editor.DiagramEditorInput.
    Oracle 排序规则
    perl 异步超时 打印错误
    14.6.3 Grouping DML Operations with Transactions 组DML操作
  • 原文地址:https://www.cnblogs.com/spghs/p/8136534.html
Copyright © 2011-2022 走看看