Hibernate5.2之单向一对多

一. 简介

     Hibernate中最复杂的应该就是各种关联(单向一对多、单向多对一、双向一对多、一对一、多对多)关系的映射,于是笔者就想着去写一些关于Hibernate相关的系列文章,可能最近今年项目上基本上没怎么用Hibernate,包括身边的很多人都在唱衰Hibernate,觉得他笨重、低效,但是笔者认为这都不影响其在我心目中的地位,以及他当初给笔者所带来的震撼,也影响千千万万的程序员。本系列博客中没有关于Hibernate原理性的东西的讲解,只是一些基本的示例,其实经验稍微丰富一点的程序员其实也能够想象的到其底层的一个实现原理。此篇文章为Hibernate系列的第一篇,在第二节中所创建的基础代码会贯穿着整个系列文章,在后续的博客中笔者将不在作任何的赘述。而关于第三节的数据库的创建会贯穿着一对多、HQL查询、SQL查询、QBC查询系列篇章,故在这些相关篇章中笔者将会依然使用此处所创建的数据库。本系列教程中所使用的数据库为Oracle,Hibernate的版本为5.2.0。

二. 基础代码的创建

2.1 Session工具类

  1. public class OracleSessionUtils {
  2. //获取SessionFactory
  3. public static SessionFactory getSessionFactory(){
  4. StandardServiceRegistry registry = null;
  5. SessionFactory sessionFactory = null;
  6. try{
  7. registry = new StandardServiceRegistryBuilder().configure("hibernate-oracle.xml").build();
  8. sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
  9. }catch(Exception ex){
  10. ex.printStackTrace();
  11. StandardServiceRegistryBuilder.destroy(registry);
  12. }
  13. return sessionFactory;
  14. }
  15.  
  16. //打开并返回一个Session
  17. public static Session openSession(){
  18. return getSessionFactory().openSession();
  19. }
  20.  
  21. //关闭Session
  22. public static void closeSession(Session session){
  23. if(null != session){
  24. session.close();
  25. }
  26. }
  27. }

2.2 基础单元测试代码

  1. public class HibernateTest {
  2. private Session session;
  3.  
  4. @Before
  5. public void openSession(){
  6. session = OracleSessionUtils.openSession(); //打开会话
  7. }
  8.  
  9. @After
  10. public void closeSession(){
  11. OracleSessionUtils.closeSession(session);
  12. }
  13. }

三. 数据库的创建

  1. create table CUSTOMER
  2. (
  3. id NUMBER(10) not null,
  4. name VARCHAR2(255 CHAR),
  5. phone_number VARCHAR2(255 CHAR),
  6. primary key (ID)
  7. );
  8. create table ORDERS
  9. (
  10. id NUMBER(10),
  11. order_id VARCHAR2(255 CHAR),
  12. create_time TIMESTAMP(6),
  13. customer_id NUMBER(10),
  14. primary key (ID)
  15. );

四. hbm文件的方式

 4.1 POJO类的创建

  1. public class Customer {
  2. private int id;
  3. private String name;
  4. private String phoneNum;
  5. private Set<Order> orderSet;
  6. //setter and getter
  7. }
  8.  
  9. public class Order {
  10. private int id;
  11. private String orderId;
  12. private Date createTime;
  13. //setter and getter
  14. }

4.2 hbm文件的创建

Customer.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping>
  7. <class name="com.demo.hibernate.one2many.Customer" table="customer">
  8. <id name="id" type="int">
  9. <generator class="sequence">
  10. <param name="sequence">cus_order_seq</param>
  11. </generator>
  12. </id>
  13. <property name="name" type="string" column="name"></property>
  14. <property name="phoneNum" type="string" column="phone_number"></property>
  15. <set name="orderSet">
  16. <key column="customer_id"></key>
  17. <one-to-many class="com.demo.hibernate.one2many.Order"/>
  18. </set>
  19. </class>
  20. </hibernate-mapping>

Order.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping>
  7. <class name="com.demo.hibernate.one2many.Order" table="orders">
  8. <id name="id" type="int">
  9. <generator class="sequence">
  10. <param name="sequence">cus_order_seq</param>
  11. </generator>
  12. </id>
  13. <property name="orderId" column="order_id" type="string"></property>
  14. <property name="createTime" column="create_time" type="timestamp"></property>
  15. </class>
  16. </hibernate-mapping>

五.注解的方式

  注解的方式已经逐渐替代了以前的XML文件配置的方式,摈弃了以往每修改一次POJO类就必须修改XML文件的繁琐的方式。注:注解可以放在成员变量的上面,也可以放在对应的get方法上面。

Customer.java

  1. @Entity
  2. @Table(name="customer")
  3. public class Customer {
  4. @Id
  5. @Column(name="id")
  6. @GenericGenerator(name="sequenceGenerator", strategy="sequence", parameters={@Parameter(name="sequence", value="cus_order_seq")})
  7. @GeneratedValue(generator="sequenceGenerator")
  8. private int id;
  9.  
  10. @Column(name="name")
  11. private String name;
  12.  
  13. @Column(name="phone_number")
  14. private String phoneNum;
  15.  
  16. @OneToMany
  17. @JoinColumn(name="customer_id")
  18. private Set<Order> orderSet;
  19.  
  20. //setter and getter
  21. }

Order.java

  1. @Entity
  2. @Table(name="orders")
  3. public class Order {
  4. @Id
  5. @Column(name="id")
  6. @GenericGenerator(name="sequenceGenerator", strategy="sequence", parameters={@Parameter(name="sequence", value="cus_order_seq")})
  7. @GeneratedValue(generator="sequenceGenerator")
  8. private int id;
  9.  
  10. @Column(name="order_id")
  11. private String orderId;
  12.  
  13. @Column(name="create_time")
  14. @Type(type="timestamp")
  15. private Date createTime;
  16.  
  17. //setter and getter
  18. }

六. 代码测试

A.保存

  1. @Test
  2. public void save(){
  3. Transaction tx = session.beginTransaction();
  4. Customer customer = new Customer();
  5. customer.setName("AAAAA");
  6. customer.setPhoneNum("334411");
  7.  
  8. Order order = new Order();
  9. order.setCreateTime(new Date());
  10. order.setOrderId("A");
  11.  
  12. Order order1 = new Order();
  13. order1.setCreateTime(new Date());
  14. order1.setOrderId("B");
  15.  
  16. Set<Order> orderSet = new HashSet<Order>();
  17. orderSet.add(order);
  18. orderSet.add(order1);
  19.  
  20. customer.setOrderSet(orderSet);
  21. session.save(customer);
  22. session.save(order);
  23. session.save(order1);
  24. tx.commit();
  25. }

B.get查询

  1. @Test
  2. public void get(){
  3. Customer customer = session.get(Customer.class, 42);
  4. System.out.println("查询Customer的SQL已经发送");
  5. System.out.println(customer.getPhoneNum() + "::" + customer.getName());
  6. Set<Order> set = customer.getOrderSet();
  7. System.out.println("查询Order的SQL还未发送,因为延迟加载,只有当在使用Order的时候才会发送SQL");
  8. for(Order o : set){
  9. System.out.println(o.getOrderId() + "::" + o.getCreateTime());
  10. }
  11. }

C.load查询

  1. @Test
  2. public void load(){
  3. Customer customer = session.load(Customer.class, 42);
  4. System.out.println("查询Customer的SQL还未发送,只有当使用的时候才会放松SQL");
  5. System.out.println(customer.getPhoneNum() + "::" + customer.getName());
  6. Set<Order> set = customer.getOrderSet();
  7. System.out.println("查询Order的SQL还未发送,因为延迟加载,只有当在使用Order的时候才会发送SQL");
  8. for(Order o : set){
  9. System.out.println(o.getOrderId() + "::" + o.getCreateTime());
  10. }
  11. }

D.删除

  1. @Test
  2. public void delete(){
  3. Customer customer = new Customer();
  4. customer.setId(42);
  5. /* 如果设置了Order则会先执行更新
  6. Order order = new Order();
  7. order.setId(43);
  8. Order order1 = new Order();
  9. order1.setId(44);
  10. Set<Order> orderSet = new HashSet<Order>();
  11. orderSet.add(order);
  12. orderSet.add(order1);
  13. customer.setOrderSet(orderSet);
  14. */
  15. Transaction tx = session.beginTransaction();
  16. session.delete(customer);
  17. tx.commit();
  18. }

E.更新

  1. @Test
  2. public void update(){
  3. Customer customer = new Customer();
  4. customer.setId(45); //如果没有设置Id会报错
  5. customer.setName("BBBNNN");
  6. customer.setPhoneNum("990088");
  7.  
  8. Order order = new Order();
  9. order.setId(46); //如果没有Id则会执行插入
  10. order.setCreateTime(new Date());
  11. order.setOrderId("N");
  12.  
  13. Order order1 = new Order();
  14. order1.setId(47); //如果没有Id则会执行插入
  15. order1.setCreateTime(new Date());
  16. order1.setOrderId("G");
  17.  
  18. Set<Order> orderSet = new HashSet<Order>();
  19. orderSet.add(order);
  20. orderSet.add(order1);
  21. //如果Customer中设置了Order,会先将Order表的customer_id置空,然后再更新customer_id
  22. //但是不会更新其他的数据
  23. customer.setOrderSet(orderSet);
  24.  
  25. Transaction tx = session.beginTransaction();
  26. session.update(customer);
  27. tx.commit();
  28. }

下一篇:Hibernate5.2之单向一对多(二)

Hibernate5.2关联关系之单向一对多(一)的更多相关文章

  1. Hibernate5.2关联关系之单向多对一(二)

    Hibernate5.2之单向一对多(二) 一. 简介 在本篇博文中笔者会在上一篇博客的代码基础上进行修改,本篇文章将介绍单向的一对多. 二. hbm文件的方式 Customer.hbm.xml &l ...

  2. JPA(六):映射关联关系------映射单向一对多的关联关系

    映射单向一对多的关联关系 新建项目项目请参考<JPA(二):HellWord工程>,基于上一章讲解的<JPA(五):映射关联关系------映射单向多对一的关联关系>中的例子进 ...

  3. Hibernate5.2关联关系之双向一对多(三)

                                                           Hibernate之双向一对多(三) 一.简介 本篇博文接着上一章的内容接着开展,代码也是 ...

  4. 7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)

    单向一对多的关联关系 具体体现:1的一方有n的一方的集合的引用,n的一方却没有1的一方的引用 举个例子:顾客Customer对订单Order是一个单向一对多的关联关系.Customer一方有对Orde ...

  5. JPA 单向一对多关联关系

    映射单向一对多的关联关系 1.首先在一的一端加入多的一端的实体类集合 2.使用@OneToMany 来映射一对多的关联关系3.使用@JoinColumn 来映射外键列的名称4.可以使用@OneToMa ...

  6. JPA中实现单向一对多的关联关系

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  7. Hibernate(7)关联关系_单向1对n

    1.单向一对多(@OneToMany)关联是比较少用的(一般用双向一对多代替). 2.实体类: 1端:Publishers.java public class Publishers { private ...

  8. (十一)Hibernate中的多表操作(1):单向一对多

    一.单向一对多() 案例一(用XML文件配置): 一个班级有多个学生,班级可以查看所有学生的信息. ClassBean.java package bean; import java.util.Hash ...

  9. jpa单向一对多

    单向一对多是一个类中的一条记录可对应另一个类的多条记录: 比如一个部门可对应多个员工:   jpa中的实现步骤:     one-to-many的one类中添加一个many类类型的set;比如部门类D ...

随机推荐

  1. ASP.NET jquery.uploadify上传控件中文乱码解决办法(转)

    原文地址:http://blog.csdn.net/ningxi_/article/details/6234725 在一般处理程序上加上这几句话: context.Response.ContentTy ...

  2. AngularJS: 'Template for directive must have exactly one root element' when using 'th' tag in directive template

    .controller('HomeController', function($scope,$location) { $scope.userName='天下大势,为我所控!'; $scope.clkU ...

  3. [Android] Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'

    我们开发的产品,有一部分功能,需要在WebView中打开web页面,然后在web页面中通过js方法回调部分native的功能. 对于web回调native的开发方式,如果不了解的话,可以参考我以前的一 ...

  4. Android开发--ScrollView的应用

    1.简介 当内容无法全部显示时,需要采取滚动的方式获取其与内容.其中,ScrollView为垂直滚动控件,HorizontalScrollView为水平滚动控件. 2.构建

  5. 转:在支持ARC工程中编译不支持ARC的文件

    转:http://blog.csdn.net/duxinfeng2010/article/details/8709697 实践总结:-fno-objc-arc 设置 解决了 旧代码中存在 releas ...

  6. ios 程序学习

    马上着手开发iOS应用程序:五.提交应用与寻找信息 2013-01-11 15:36 佚名 apple.com 我要评论(0) 字号:T | T 本文介绍了您已经学习完如何开发一个优秀的iOS应用之后 ...

  7. Leetcode 1 two sum 难度:0

    https://leetcode.com/problems/two-sum/ class Solution { public: vector<int> twoSum(vector<i ...

  8. XML学习摘要

    XML元素可以在开始标签中包含属性. 属性(Attribute)提供关于元素的额外信息,属性必须加引号. 属性值必须被引号包围,不过单引号和双引号均可,若属性值本身包含双引号,那么有必要使用单引号包围 ...

  9. php的特性

    PHP的特性包括: 1. PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语法. 2. PHP可以比CGI或者Perl更快速的执行动态网页——动态页面方面,与其他的编程语言相比 ...

  10. 定时调度框架Quartz随笔

    最近项目中的定时批处理用到了quartz定时任务,在此记录下quartz的配置吧,一个小demo仅供参考,也方便自己今后复习! 下面直接来步骤吧! 一.首先,要搭起能让quartz正常运行的环境,至少 ...