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("yang","123456","890","广州","15800027127","hbhz.sysu.tengfei@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

Hibernate入门5持久化对象关系和批量处理技术的更多相关文章

  1. hibernate学习之持久化对象

    Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存 是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置 ...

  2. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. Hibernate基础学习(五)—对象-关系映射(下)

    一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...

  4. Hibernate基础学习(四)—对象-关系映射(上)

    一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...

  5. hibernate框架(3)---持久化对象

    持久化对象 再讲持久化对象之前,我们先来理解有关session中get方法与 load方法区别: 简单总结: (1)如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库 ...

  6. Hibernate之深入持久化对象

    Hibernate是一个彻底的O/R Mapping 框架.之所以说彻底,是因为相对于其他的 框架 ,如Spring JDBC,iBatis 需要手动的管理SQL语句,Hibernate采用了完全 面 ...

  7. Hibernate单向多对一对象关系模型映射

    单向的many-to-one 案例: 班级和学生 父亲和子女 单向:只能由其中一方维护关系 Many-to-one中有many的一方法维护或者体现两者之间的关系. 单向的many-to-one描述学生 ...

  8. Hibernate的核心对象关系映射

    Hibernate的核心就是对象关系映射: 加载映射文件的两种方式: 第一种:<mapping resource="com/bie/lesson02/crud/po/employee. ...

  9. Hibernate映射--基本类映射和对象关系映射(转)

    原文地址:http://blog.csdn.net/lovesummerforever/article/details/20901011   尊重原创,请访问原网址 回想一些我们在没有学习ssh的时候 ...

随机推荐

  1. Linux ps命令详解与示例说明

      ps:要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结 ...

  2. [Delphi编译错误]F2084 Internal Error: U2107

    看到这个错误真是头痛,这是一个很旧的项目了,想修改下东西,清理下工程一编译出现这个该死的错误,百度了下,也没解决问题.没办法只好编译所有的BPL了.   这个项目是带包编译的,而且带了几个自己的包. ...

  3. css小技巧之去掉蓝色底块的方法

    -moz-user-select: none; /*火狐*/ -webkit-user-select: none; /*webkit浏览器*/ -ms-user-select: none; /*IE1 ...

  4. Android照片墙应用实现,再多的图片也不怕崩溃

    本文首发于CSDN博客,转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9526203 照片墙这种功能现在应该算是挺常见了,在很多应用 ...

  5. P2320 [HNOI2006]鬼谷子的钱袋

    洛谷2320 06湖南 鬼谷子的钱袋 来源 题目描述 鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政.有一天,他在咸阳游历的时候,朋友告诉他在咸阳最大的拍卖行(聚宝商行 ...

  6. SQL多行转多列

    --★转换结果如上图 1.首先创建表: CREATE TABLE [成绩表]( ,) NOT NULL, )NULL, , )NULL, , )NULL, , )NULL ) ON [PRIMARY] ...

  7. DevExpress组件之——PopupMenu组件(转)

    出处:http://www.cnblogs.com/xlx0210/archive/2010/07/14/1777366.html 目录在项目中使用了第三方控件DevExpress,得开始研究其他控件 ...

  8. 20151009 C# 第一篇 程序编写规范

    20151009 程序编写规范 1. 代码书写规则: 1).尽量使用接口,然后使用类实现接口. 2).关键语句写注释 3).避免写超过5个参数的方法,如果要传递多个参数,则使用结构 4).避免代码量过 ...

  9. 使用Notepad++编码编译时报错(已解决?)

    使用Notepad++编码编译时报错(已解决?) 使用Notepad++编码,编译的时候经常会报错,说什么GBK编码啥啥啥~~~但同样的编码用ECLIPSE就没有问题.再有,用记事本把他保存成ANSI ...

  10. 导入DXF文件

    1.选择菜单“File-Import-DXF”. 2.设置DXF文件参数.DXF file:选择DXF结构文件,单位,要和DXF源文件的单位一致.在DXF file中选择文件后,下方的Layer co ...