Hibernate中Session增删改查操作代码详解

 更新时间:2017年12月12日 08:39:42   作者:街灯下的小草  
这篇文章主要介绍了Hibernate中Session增删改查操作代码详解,具有一定借鉴价值,需要的朋友可以参考下。

把三状态转换图放在这,方便分析方法的作用:

1.Session的save()方法

Session是Hibernate所有接口中最重要的接口,提供了对数据保存,更新,查询和删除的方法。

Session的save()方法可以使临时态或游离态转换为持久态。例如,保存一个Customer对象:

SessionFactory sessionFactory;
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tr = session.beginTransaction();
//1.创建Customer对象 
Customer c1 = new Customer();
c1.setId(new long(1));
c1.setName("test");
c1.setEmail("123456789@qq.com");
c1.setPassword("123456");
c1.setAddress("世外桃源");
//2.调用Session的save()方法,将Customer对象持久化 
session.save(c1);
tr.commit();
session.close();

Save()方法主要做了以下三件事:

(1)将new创建的临时态的Customer对象放入缓存,使其持久化。

(2)同时根据对象关系映射文件中设置的OID生成器,即主键生成方式给该对象生成一个唯一的OID。

<!--设置主键-->
<idname="id"column="ID"type="long">
<!--主键生成方式-->
<generatorclass="increment"/>
</id>

在这个地方有一个疑问,创建对象时setId()方法是否是为该对象持久化生成主键,其实不是,setId并没有按照我们设定的那样生成主键,而是靠对象关系映射文件配置的主键生成方式生成主键,可以多运行几次,主键自增长,从数据库可以看到多条数据,主键从1开始,所以可以知道setId()

没有设置主键,否则数据库主键唯一性校验都过不去。

我们也可以手动设置主键值,必须重载save()方法,使用重载方法save(c1,newLong(1)),每次手动设置。

(3)计划执行insert语句。注意,insert语句并没有立刻执行,只有当Session清理缓存时,才会执行insert语句。tr.commit()事务提交。

2.Session的update()方法

使游离态对象变成持久态对象。例如:

SessionFactory sessionFactory; 
Configuration configuration = new Configuration().configure(); 
sessionFactory = configuration.buildSessionFactory(); 
Session session1 = sessionFactory.openSession(); 
Transaction tr1 = session1.beginTransaction(); 
//1.创建Customer对象 
Customer c1 = new Customer(); 
c1.setId(new Long(1)); 
c1.setName("test"); 
c1.setEmail("123456789@qq.com"); 
c1.setPassword("123456"); 
c1.setAddress("世外桃源"); 
//2.调用Session的save()方法,将Customer对象持久化 
session1.save(c1); 
tr1.commit(); 
session1.close(); 
//3.将游离态的对象更新,发现改变,执行update语句 
Session session2 = sessionFactory.openSession(); 
Transaction tr2 = session2.beginTransaction(); 
c1.setAddress("测试update"); 
session2.update(c1); 
tr2.commit(); 
session2.close();

Session的update()注意做以下事:

(1)把游离态的Customer对象从新加入Session缓存中,使其变成持久化对象。

(2)执行update语句。跟save()执行insert语句一样,并不是立刻执行update语句,需要等缓存清空时,把Customer对象组装成update语句,

然后再执行。

注意,即使Customer没有改变,默认情况下,缓存清除时也会组装Update语句,如果需要设置成改变成才执行update语句,需要设置对象关系映射文件。

3.Session的saveOrUpdate()方法

saveOrUpdate()方法包含save()和update()方法的功能,根据传入参数状态,调用不同方法。传入临时态对象调用save()方法,如果传入游离态对象调用

update()方法。传入持久态对象返回。所以,每次我们只需传入对象,saveOrUpdate()方法,自动判断传入对象状态的状态,动态调用处理方法。

该方法如何判断传入对象的状态?当满足以下任意一个条件时,就是临时态:

(1)java对象的OID为null,说明该对象没有别实例化,即使被实例化,也是游离态被删除后变成临时态的对象,这种情况下的对象为临时态。

(2)如果java对象具有版本控制(version),版本号为null的,也就是没有该对象的版本号。

(3)自定义拦截器,调用isUnsaved()返回值为true。

4.Session的load()和get()方法

这两个方法都是根据OID,从数据库中加载一个持久化对象。持久化对象放在Session缓存中,可以根据不同的需要操作该持久化对象。

两者区别:

当数据库中OID没有对应记录时,load()抛异常,get()返回null。

5.Session的delete()方法

delete()顾名思义删除,用于从数据库中删除java对象对应的记录。

delete()如果传入持久化对象,组装delete语句,执行删除;如果传入游离态对象,hibernate先把游离态关联到session,变成持久态,再生成delete语句,

执行删除。

都是只有当session缓存清空时,才执行。

以上执行都是一个对象,对应一条记录。

可以用session.delete("fromCustomerwhere....");后面加上条件删除多条数据。

SessionFactory sessionFactory; 
Configuration configuration = new Configuration().configure(); 
sessionFactory = configuration.buildSessionFactory(); 
Session session1 = sessionFactory.openSession(); 
Transaction tr1 = session1.beginTransaction(); 
//1.创建Customer对象 
Customer c1 = new Customer(); 
c1.setId(new Long(1)); 
c1.setName("test"); 
c1.setEmail("123456789@qq.com"); 
c1.setPassword("123456"); 
c1.setAddress("世外桃源"); 
//2.调用Session的save()方法,将Customer对象持久化 
session1.save(c1); 
tr1.commit(); 
session1.close(); 
//3.将游离态的对象关联到session,持久化后清除缓存,执行delete语句;放入持久态的直接删除; 
Session session2 = sessionFactory.openSession(); 
Transaction tr2 = session2.beginTransaction(); 
session2.delete(c1); 
tr2.commit(); 
session2.close(); 

执行结果,控制台输出:

Hibernate: select max(ID) from CUSTOMERS
Hibernate: insert into CUSTOMERS (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, DESCRIPTION, IMAGE, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: delete from CUSTOMERS where ID=?

总结

以上就是本文关于Hibernate中Session增删改查操作代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • Java中final关键字详解及实例

    Java中final关键字详解及实例

    这篇文章主要介绍了Java中final关键字详解及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java 单例模式的实现资料整理

    Java 单例模式的实现资料整理

    这篇文章主要介绍了Java 单例模式的实现的相关资料,并附简单实例代码,需要的朋友可以参考下
    2016-10-10
  • 通过反射注解批量插入数据到DB的实现方法

    通过反射注解批量插入数据到DB的实现方法

    今天小编就为大家分享一篇关于通过反射注解批量插入数据到DB的实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • java web开发之实现购物车功能

    java web开发之实现购物车功能

    这篇文章主要为大家详细介绍了java web开发之实现购物车功能的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Spring session实现共享单点登录案例过程解析

    Spring session实现共享单点登录案例过程解析

    这篇文章主要介绍了Spring session实现共享单点登录案例过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Android Studio中创建java工程的完整步骤

    Android Studio中创建java工程的完整步骤

    Android Studio创建java工程是非常麻烦的,因为Android Studio没有提供直接创建java工程的方法,下面这篇文章主要给大家介绍了关于Android Studio中创建java工程的完整步骤,需要的朋友可以参考下
    2024-01-01
  • Java使用lambda表达式简化代码的示例详解

    Java使用lambda表达式简化代码的示例详解

    这篇文章主要给大家介绍了Java如何使用lambda表达式简化代码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-11-11
  • 详解Java中Vector和ArrayList的区别

    详解Java中Vector和ArrayList的区别

    这篇文章主要为大家详细介绍了Java中Vector和ArrayList的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Java中EasyExcel使用自定义Converter处理方法详解

    Java中EasyExcel使用自定义Converter处理方法详解

    EasyExcel自定义Converter是指在使用EasyExcel进行Excel读写操作时,可以自定义转换器来处理一些不支持的数据类型,这篇文章主要给大家介绍了关于Java中EasyExcel使用自定义Converter处理的相关资料,需要的朋友可以参考下
    2024-08-08
  • 关于Java中的继承和组合的一个错误使用的例子

    关于Java中的继承和组合的一个错误使用的例子

    这篇文章主要介绍了关于Java中的继承和组合的一个错误使用的例子,需要的朋友可以参考下
    2016-08-08

最新评论