Hibernate入门04_双向多对一

来源:互联网 发布:玛雅动漫制作软件 编辑:程序博客网 时间:2024/06/06 11:02

这里还是以顾客和订单之间的关系来说明,一个客户可以有多个订单,但是一个订单只能对应一个客户;

1、项目的目录结构
这里写图片描述

2、Customer.java

import java.util.HashSet;import java.util.Set;/**客户-可以有多个 */public class Customer {    private Integer customerId;    private String customerName;    /**需要把集合初始化防止发生null指针异常*/    private Set<Order> orders = new HashSet<>();    //get/set...}

Customer.hbm.xml映射文件

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-3-25 18:05:11 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping package="com.hibernate.entities.n21both">    <class name="Customer" table="CUSTOMERS">        <id name="customerId" type="java.lang.Integer">            <column name="CUSTOMER_ID" />            <generator class="native" />        </id>        <property name="customerName" type="java.lang.String">            <column name="CUSTOMER_NAME" />        </property>        <!-- 映射一对多的集合映射 set的三个属性: inverse="true":放弃维护关联关系,让Order来维护, cascade="delete":设置级联关系删除             , cascade="delete-orphan";开发是不建议设置cascade,建议手动删除 order-by:在查询时对集合中的元素进行排序 -->        <set name="orders" table="ORDERS" inverse="true" order-by="ORDER_NAME DESC">            <key column="CUSTOMER_ID"></key>            <one-to-many class="Order" />        </set>    </class></hibernate-mapping>

3、Order.java

public class Order {    private Integer orderId;    private String orderName;    private Customer customer;    //set/get...}

Order.hbm.xml映射文件

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-3-25 18:05:11 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping package="com.hibernate.entities.n21both">    <class name="Order" table="ORDERS">        <id name="orderId" type="java.lang.Integer">            <column name="ORDERID" />            <generator class="native" />        </id>        <property name="orderName" type="java.lang.String">            <column name="ORDER_NAME" />        </property>        <!-- 映射多对一的关联关系  使用多对一的关联关系 -->        <many-to-one name="customer" class="Customer" column="CUSTOMER_ID"></many-to-one>    </class></hibernate-mapping>

4、hibernate.cfg.xml配置文件

<?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.username">root</property>        <property name="connection.password">root</property>        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate01</property>        <!-- hibernate的基本信息 -->        <!-- hibernate使用的数据库方言 -->        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>        <!-- 执行操作时是否在控制台打印sql语句 -->        <property name="show_sql">true</property>        <!-- 是否对sql进行格式化 -->        <property name="format_sql">true</property>        <!-- 指定自动生成数据表的策略 -->        <property name="hbm2ddl.auto">update</property>        <!-- 设置hibernate的隔离级别 -->        <property name="connection.isolation">2</property>        <!-- 删除对象后,设置其OID为null -->        <property name="use_identifier_rollback">true</property>        <!-- 配置C3P0数据源 -->        <property name="c3p0.max_size">100</property>        <property name="c3p0.min_size">5</property>        <property name="c3p0.acquire_increment">2</property>        <property name="c3p0.idle_test_period">2000</property>        <property name="c3p0.timeout">2000</property>        <property name="c3p0.max_statements">10</property>        <!-- 设置JDBC的statement读取数据库的时候每次从数据库中读取记录条数,这个值100合适,太大会损耗内存,小了速度慢 -->        <property name="jdbc.fetch_size">100</property>        <!-- 设置数据库进行批量删除,更新,插入的时候批次的大小,30比较合适 -->        <property name="jdbc.batch_size">30</property>        <!-- 指定关联的hbm.xml文件 -->        <mapping resource="com/hibernate/entities/n21both/Order.hbm.xml"/>        <mapping resource="com/hibernate/entities/n21both/Customer.hbm.xml"/>    </session-factory></hibernate-configuration>

5、Test测试

import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.hibernate.entities.n21both.Customer;import com.hibernate.entities.n21both.Order;public class HibernateTest {    private SessionFactory sessionFactory;    private Session session;    private Transaction transaction;    @Test    public void testOne2ManySave() {        Customer customer = new Customer();        customer.setCustomerName("AA");        Order order1 = new Order();        order1.setOrderName("Oyder1");        Order order2 = new Order();        order2.setOrderName("Oyder2");        // 设定关联关系        order1.setCustomer(customer);        order2.setCustomer(customer);        customer.getOrders().add(order1);        customer.getOrders().add(order2);        // 三条insert两条update        session.save(customer);        session.save(order1);        session.save(order2);        // 三条insert,4条update        // session.save(order1);        // session.save(order2);        // session.save(customer);    }    @Test    public void testOne2ManyGet() {        // 对多的一端采用延迟加载        Customer customer = (Customer) session.get(Customer.class, 1);        System.out.println(customer.getCustomerName());        System.out.println(customer.getOrders().getClass());    }    @Test    public void testOne2ManyDelete(){        //设定级联 cascade="delete":设置级联关系删除关系后,可以删除        Customer customer = (Customer) session.get(Customer.class, 1);        session.delete(customer);    }    @Test    public void testCascade_Orphan(){        //设定级联 cascade="delete-orphan":设置级联关系删除关系后,可以删除        Customer customer = (Customer) session.get(Customer.class, 2);        customer.getOrders().clear();//      session.delete(customer);    }    @Before    public void init() {        System.out.println("HibernateTest.init()");        // 1.创建一个sessionFactory对象        Configuration configuration = new Configuration().configure();        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())                .buildServiceRegistry();        sessionFactory = configuration.buildSessionFactory(serviceRegistry);        // 2.创建一个session对象        session = sessionFactory.openSession();        // 3.开启事务        transaction = session.beginTransaction();    }    @After    public void destroy() {        System.out.println("HibernateTest.destroy()");        // 5.提交事务        transaction.commit();        // 6.关闭session        session.close();        // 7.关闭SessionFactory        sessionFactory.close();    }}

6、备注:本博客适合有一定java基础,对数据库有一定认识的读者。不会做过多的文字描述,敬请原谅。本人也是新手,写博客当做笔记作分享,不喜勿喷,欢迎指教。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 英雄联盟连接不上聊天服务器怎么办 用黄金换玫瑰金后悔了怎么办 劳力士日志系列玫瑰金和黄金怎么办 香菇代进地注水后长满绿毛怎么办 群主给你带了不满意的头衘怎么办 普兰德雪地靴洗变色了怎么办 书被水泡了皱了黏了怎么办 书被水泡了皱了没干怎么办 眼皮干燥起皮起皱怎么办能治好吗 手指头起小水泡指甲不平整怎么办 这几天我的内裤上带点血丝怎么办 一个月宝宝私处捂白了怎么办 工资算了字签了老板没把钱怎么办 百合种球叶子都变黄了怎么办 新买的富贵竹叶子发黄怎么办水养 朋友总是以隐私为借口欺骗我怎么办 三星手机版本低下载不了微信怎么办 选了动漫制作技术但不会画画怎么办 做主播高薪可是心累不愿做了怎么办 pr导出的avi无压缩太大怎么办 捡了个小米max被绑定了怎么办 二十岁时头发开始掉了怎么办 在酒店换衣服忘记关窗帘了怎么办 淘宝店铺装修更改图片要收费怎么办 惠阳市教育考试考证号忘记怎么办 高考完被被骗去读自考以后怎么办 孩子学习遇到瓶颈期了老师该怎么办 微信家长群有不好的言论出现怎么办 铃木汽车后备箱电动锁没有电怎么办 坐飞机没有连号座位带孩子怎么办 白沙的衣服洗衣服时染上颜色怎么办 网购商家少发了货怎么办 我想成为安利的员工怎么办会员 安利皇后锅锅盖吸在桌子上怎么办 淘宝客服退款返佣金诈骗后怎么办 第一试用网的钱提现出现问题怎么办 一个手机号注册两个京东账号怎么办 白色衣服被洗衣粉泡白了怎么办 白色衣服染成一块块荧光色了怎么办 中脉远红镇痛护腰不会发热了怎么办 用完悦诗风吟脸变黑不均匀怎么办