zoukankan      html  css  js  c++  java
  • Hibernate一对多

    例如:一个用户可以对应多个订单  但一个订单只能对应一个用户

    1.创建实体类

    2.编写映射文件

    <?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="com.bdqn.cn.pojo2" >
        <!-- 因为我们在上一行package里配置了包名所以name这里可以直接写实体类名
             table对应数据库表名
         -->
        <class name="Student" table="student">
            <!-- id对应的是主键name对应实体类属性名column对应数据库字段名 -->
            <id name="stuid" column="stuid">
                <!-- 主键生成策略 increment 适用于代理主键 由hibernate自动以递增的方式生成标识符 每次增量为1 -->
                <generator class="increment"/>
            </id>
            <property name="sname" column="sname"/>
            <!-- 我们实体类用到了set集合所以这里用set -->
            <!-- cascade里面写save-update级联插入就是当这个表插入数据时和他关联的数据也会插入 
                 delete级联删除和save-update同理
                  delete-orphan为孤儿删除  仅限于一对多  只有一对多时才会出现类似父子关系的存在  才有父子表的存在  认为一方为父方
                  也就是当一的一方和多的一方解除关系时  实际上就是外键值赋为null 将这总记录删除时就叫孤儿删除
                  双向维护会产生多余的sql,要想解决这个问题需要双方有一方放弃维护外键,一般都是一的一方放弃  需要在<set>标签里写inverse="true"
            -->
            <set name="orders" cascade="save-update,delete,delete-orphan" inverse="true">
                <!--  标签<key>用来描述一对多   多一方的外键名-->
                <key column="cno"/>
                <!-- 标签<one-to-many>设置一对多映射关系   class设置映射关联目标实体类 -->
                <one-to-many class="Orders"/>
            </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="com.bdqn.cn.pojo2">
        <class name="Orders" table="orders">
            <id name="oid" column="oid">
                <generator class="increment"/>
            </id>
            <property name="addr" column="addr"/>
            <!-- 标签<many-to-one>设置多对一映射关系  cloumn对应的外键名称 
                 cascade在student映射文件已经解释
            -->
            <many-to-one name="stu" column="cno" class="Student" cascade="save-update"/>
        </class>
    </hibernate-mapping>

    3.编写工具类

    4.编写配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
        <property name="connection.url">
            jdbc:mysql://localhost:3306/dsds
        </property>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password">123.com</property>
        <property name="dialect">
            org.hibernate.dialect.MySQLInnoDBDialect
        </property>
        <!-- 在控制台显不显示sql语句 -->
        <property name="show_sql">true</property>
        <!-- 格式化sql语句 -->
        <property name="format_sql">true</property>
        <!-- 指定自动生成数据表策略 -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 指定hbm.xml就是映射文件 -->
        <mapping resource="com/bdqn/cn/pojo2/Orders.hbm.xml" />
        <mapping resource="com/bdqn/cn/pojo2/Student.hbm.xml" />
    </session-factory>
    </hibernate-configuration>

    5.测试类

    public class testDemo {
        //孤儿删除
        @Test
        public void test3() {
            Session session = HibernateUtil.openSession();
            Transaction tx = session.beginTransaction();
            Student stu1 = (Student) session.get(Student.class, 1);
            Orders ord1 = (Orders) session.get(Orders.class, 1);
            //删除客户与订单的关系也就是外键值为null  删除没有客户的订单就叫做孤儿删除
            stu1.getOrders().remove(ord1);
            tx.commit();
            session.close();
        }
        
        //级联删除
        @Test
        public void test2() {
            Session session = HibernateUtil.openSession();
            Transaction tx = session.beginTransaction();
            /*如果运行时出现Java . lang . stackoverflower error这个错误
                把toString里另一方的属性值删掉就可以了*/
            Student stu1 = (Student) session.get(Student.class, 1);
            System.out.println(stu1);
            session.delete(stu1);
            tx.commit();
            session.close();
        }
        //级联添加
        @Test
        public void test1() {
            Session session = HibernateUtil.openSession();
            Transaction tx = session.beginTransaction();
            Student student=new Student();
            student.setSname("张三");
            //建立两个订单
            Orders order1=new Orders();
            order1.setAddr("北京");
            Orders order2=new Orders();
            order2.setAddr("天津");
            //建立关系说明订单1和2属于student 
            order1.setStu(student);
            order2.setStu(student);
            student.getOrders().add(order1);
            student.getOrders().add(order2);
            /**
             * 当设置了cascade="save-update"属性时添加用户时就会把对应的订单添加进去
             */
            session.save(student);
            tx.commit();
            session.close();
        }
    
    }

  • 相关阅读:
    剑指 Offer 43. 1~n整数中1出现的次数
    剑指 Offer 54. 二叉搜索树的第k大节点(递归)
    第三个JSP作业
    第二个JSP作业-用循环结构输出三行五列的table
    第二个JSP作业-编写jsp页面,输出大写、小写英文字母表
    第一个JSP作业
    安卓课设
    第十次作业
    第八次作业
    第九次作业
  • 原文地址:https://www.cnblogs.com/yz-bky/p/12559227.html
Copyright © 2011-2022 走看看