Hibernate入门5持久化对象关系和批量处理技术 20131128

代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv

前言:

前面学习了Hibernate数据库表之间存在依赖关系的情况,在Hibernate中配置,这样在实际开发中会大大减少SQL的编写量。现在进一步深入Hibernate的级联关系。

1.级联关系

在Hibernate中持久化对象之间通过相互关联互相引用,对象进行保存、更新和删除的时候,关联的对象也会执行相对应的操作,这些使用Hibernate中的cascade实现。比如当试图删除一个顾客的时候,级联可以让hibernate决定是否删除该顾客的订单。cascade是<set>中的一个属性,可以选取的值如下:

none: default,表示关联对象之间是无级联操作的

save-update:表示主动方对象在调用save() update() saveOrUpdate()方法的时候对被关联对象执行保存或者是更新操作。

delete: 表示主动方对象在调用delete的时候被关联对象执行删除操作

delete-orphan

all:表示save-update和delete的结合

也就是说,创建一个Customer,给customer中的order添加订单,那么保存customer的时候,也会保存order的信息。

同时还存在一种反向控制,使用<set>元素中的inverse属性控制,inverse=”true”表示关联关系有N方维护,这样当新建一个订单的时候,使用order.setCustomer(),保存customer的时候,同样也会保存订单信息。

2.一对一的关联关系

基于外键的单项1-1

<many-to-one name="idCard" class="IdCard" cascade="all" column="idcard_id" unique="true"/>

也就是N方式唯一的,这样就是一对一的关系了

基于主键的双向的1-1

上面的方式,可以考虑使用<one-to-one>的方式

<one-to-many>

单项的N-N关系

    Order.java中添加字段Set<Product> products以及相应的getter & setter

<set name=”products” table=”orderitem”>

<key column=”order_id”/>

<many-to-many class=”Product” columns=”product_id”/>

</set>

这样会生成一张表orderitem,其中只有两个字段 order_id and product_id

好乱的关系啊,不学了,稍后在学吧

3.Hibernate批量处理技术

当需要同时网数据库中添加多条数据的时候,需要使用到批量处理技术。

3.1批量插入

public static void addCustomers(){

Session session = HibernateUtil.getSession();

Transaction trans = session.beginTransaction();

for(int i = 0; i< 10; i++){

Customer customer = new Customer("yang","123456","890","广州","15800027127","hbhz.sysu.tengfei@qq.com");

session.save(customer);

}

trans.commit();

HibernateUtil.closeSession();

}

在没有学习批量处理之前我们,会想到使用这种方法,因为hibernate本身是有一个一级缓存的,也就是Session缓存,当session中的对象过多的时候,程序会出现运行失败的情况,并且抛出内存溢出的异常OutOfMemoryException

为了解决这个问题,可以定时的将Session缓存中的数据刷新导数据库中而不是一直缓存在Session中,比如20个为一个单位。

public static void addCustomers(){

Session session = HibernateUtil.getSession();

Transaction trans = session.beginTransaction();

for(int i = 0; i< 1000000000; i++){

Customer customer = new Customer("sssg","12sss56","890","广州","sssss","sssssssi@qq.com");

customer.setUserName("name"+(i+1));

session.save(customer);

if(i%20 == 0){

session.flush();

session.clear();

trans.commit();

trans = session.beginTransaction();

}

}

trans.commit();

HibernateUtil.closeSession();

}

3.2批量更新

采用类似批量插入的方法,来完成批量的更新;或者是使用scroll()将返回的数据进行更新操作,从而充分利用游标所带来的性能优化:

方法一:

public static void updateCustomers(){

Session session  = HibernateUtil.getSession();

Transaction trans = session.beginTransaction();

ScrollableResults customers = session.createQuery("from Customer").scroll();

int count = 1;

while(customers.next()){

Customer customer = (Customer) customers.get(0);

customer.setUserName("yang"+count);

if(count%20 == 0){

session.flush();

session.clear();

trans.commit();trans= session.beginTransaction();

}

count++;

}

trans.commit();

HibernateUtil.closeSession();

}

上面这些跟新是每一条更新就会执行一条SQL,效率比较低。HQL中可以支持批量更新和删除的

update | delete from ClassName [where condition] 注意这里使用的是Class中的属性而不是数据库中表的列的名称

public static void updateCustomerByHQL(){

Session session = HibernateUtil.getSession();

Transaction trans = session.beginTransaction();

String hql = "update Customer c set c.userName = :newName";

Query query = session.createQuery(hql);

query.setString("newName", "yangtengfei");

query.executeUpdate();

trans.commit();

HibernateUtil.closeSession();

}

YangTengfei

2013.11.28

转载于:https://www.cnblogs.com/hbhzsysutengfei/p/3473213.html

Hibernate入门5持久化对象关系和批量处理技术相关推荐

  1. (9) hibernate加载持久化对象的两种方式——get、load

    一.get与load对比 在hibernate中get和load方法是根据id取得持久化对象的两种方法,但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更 ...

  2. hibernate加载持久化对象的两种方式---------------load方式和get方式

    2019独角兽企业重金招聘Python工程师标准>>> 参考:http://my.oschina.net/u/1169535/blog/282483 1. Hibernate get ...

  3. Hibernate旅程(五)Hibernate映射--基本类映射和对象关系映射

    回想一些我们在没有学习ssh的时候,我们建立数据库的表时,首先是数据库建模E-R图,然后再通过实体模型来建立关系模型,再建立相应的表.实体间存在三种关系,一对一,一对多(或者说多对一),多对多.而如今 ...

  4. SSH Chapter 04 Hibernate 入门

    SSH Chapter 04 Hibernate入门 笔记 Hibernate 知识体系图: 本章目标: 理解类和表的映射关系 掌握单表的增删改 掌握按主键查询 理解持久化对象的状态及其转换 技术内容 ...

  5. Hibernate入门(二)

    一.主键生成策略 1.主键的类型 自然主键: 把有特定业务含义的字段作为了主键 eg: 用户的名字, 身份证号码 代理主键: 把没有特定业务含义的字段作为了主键 eg: id 开发里面的话通常用代理主 ...

  6. Hibernate→HQL、query.list()返回数据类型、查询相关语句、分页、原生SQL、@注解、持久化对象状态及生命周期、一多关系、继承映射关系、逆向工程

    HQL Query实例与表 session通用工具类 Query对象 from 类→List<类>接收 映射类 仅查询商品 查询商品及所在商家 别名 返回数据类型定义 Iterator接收 ...

  7. Hibernate之对象关系映射文件

    一.对象关系映射文件 POJO类和关系数据库之间的映射可以用一个XML文档来定义 在运行时Hibernate将根据这个映射文件来生成各种SQL语句 映射文件的拓展名为 .hbm.xml 1.映射文件说 ...

  8. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: ...

  9. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)...

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

最新文章

  1. 图片视角转换 cv2.warpPerspective
  2. 使用结构化的标头字段改善HTTP
  3. MyEclipse导入jquery-1.8.0.min.js等文件报错的解决方案
  4. Java中return的两种用法
  5. 使用PXE+DHCP+Apache+Kickstart批量安装CentOS5.4 x86_64
  6. 老男孩python14期全套-老男孩第十四期Python学习班之Day01
  7. Java-图书管理系统(控制台程序)
  8. ActiveMQ消息队列
  9. 【数据库】数据库系统工程师(软考中级)——学习过程总结
  10. The processing instruction target matching [xX][mM][lL] is not allowed.
  11. win10 没有计算机策略,Win10家庭版找不到组策略gpedit.msc的解决方法
  12. 计算机应用有关的论文,关于计算机应用毕业论文范文精选
  13. 拓视角丨拓宽市场边界,数智化转型构建产业新格局
  14. 分享【百度搜狗360】SEO优化交流讨论Q群【禁广告/精品群】
  15. SAP ABAP中字符大小写转换问题汇总
  16. ps4插html屏幕不亮光,万万没想到,居然是这个!PS4黑屏的原因终于找到了!
  17. VS2015新建MFC工程默认存储位置,默认位置修改
  18. MySQL使用教程(Navicat)
  19. python类中的特殊方法_python类中的特殊成员方法介绍
  20. 每当此时的FreeEIM

热门文章

  1. Android Studio 获取经纬度
  2. 变电站一键顺控(二)
  3. Oracle:UGA PGA
  4. C练题笔记之:Leetcode-827. 最大人工岛
  5. 千亿资产路劲掉队 单伟豹无心恋战地产圈?
  6. GIS数据与CAD数据间带属性字段互相转换还原工具,解决ArcGIS等软件进行GIS数据转CAD数据无法保留属性字段问题
  7. JS代码计算股票涨停
  8. nc提示java过期_用友NC系统使用过程中常见问题和解决方法!财会必看!
  9. 软考笔记(八)高级系统架构师/分析师:系统架构
  10. 马蜂窝定制游抢单系统设计与功能核心