• 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();
    
        }
    
            }
  • 相关阅读:
    C#实现汉字转换为拼音缩写的代码
    C# 使用xsd文件验证XML 格式是否正确
    C#用天气预报的WebServices
    c# socket通信较完善方案
    C#操作MySQL数据库-----HelloWorld
    c# 自己制作一个简单的项目倒计时器
    C# 制作外挂常用的API
    C#中如何计算时间差?
    C# 图片保存到数据库和从数据库读取图片并显示
    c#加密 可逆与不可逆MD5 加密
  • 原文地址:https://www.cnblogs.com/spghs/p/8136534.html
Copyright © 2020-2023  润新知