Hibernate学习笔记(三)Session

Hibernate在对数据库进行操作之前,必须先取得Session实例,相当于JDBC在对数据库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为线程安全(Thread-safe),一个Session由一个线程来使用。

  • 开启Session

Session实例由SessionFactory开启获得,例如:

Configurationconfig = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
....
tx.commit();
session.close();


开启Session不会马上取得Connection,而是在最后真正需要连接数据库进行更新或查询时才会取 得Connection,如果有设定Connection pool,则从Connection pool中取得Connection,而关闭Session时,如果有设定Connection pool,则是将Connection归还给Connection pool,而不是直接关闭Connection。

在Hibernate中,开启一个Session会建立一个Persistencecontext,它可以进行快取管理、dirty check等,而所有的读取、更新、插入等动作,则是在Transaction中完成。

  • 储存数据

透过Session,可以对数据库进行新增、删除、更新,例如使用save()新增一笔数据:

User user = newUser(); 
user.setName("momor"); 
user.setAge(new Integer(26));

Session session = sessionFactory.openSession();
Transaction tx =session.beginTransaction();
session.save(user); 
tx.commit();
session.close();


save()之后,不会马上对数据库进行更新,而是在Transaction的commit()之后才会对数据库进行更新,在Transaction之间 的操作要就全部成功,要就全部失败,如果更新失败,则在数据库层面会撤消所有更新操作,然而内存中的持久对象是不会回复原有状态的,事实上,当 Transaction失败,这一次的Session就要马上跟着失效,放弃所有内存中的对象,而不是尝试以原对象再进行更新的动作。

  • 取得资料

您使用get()或load()方法取得id为1的数据:

Session session =sessionFactory.openSession();
Transaction tx =session.beginTransaction();

User user = (User)session.get(User.class, new Integer(1));
tx.commit();
session.close();


如果未能发现相符合的数据,则get()方法会返回null,而load()方 法会丢出ObjectNotFoundException,在进阶的应用中,load()方法可以返回代理(proxy)对象,在必要时才真正查询数据库取得对应数据,并可充分利用快取机制。

在Hibernate 3中,取消了find()方法,您必须透过Query或Criteria来进行数据查询。

  • 删除数据

接下来看看使用Session删除数据,可使用delete()删除数据:

Session session =sessionFactory.openSession();
Transaction tx =session.beginTransaction();
User user = (User)session.get(User.class, new Integer(1));
session.delete(user);
tx.commit();
session.close();

  • 更新数据

当您在同一个Session中取出数据并封装为Persistence Object,接着更新对象状态,而后将Transaction commit,则对象上的状态更新将反应至数据库中,您无需额外进行任何的更新操作。

如果您开启了一个Session,从数据表中取出数据显示到用户接口上,之后关闭Session,当用户在接口上操作完毕并按下储存时,这时您要重新 开启一个Session,使用update()方法将对象中的数据更新至对应的数据表中:

Session session =sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User)session.get(User.class, new Integer(2));
tx.commit();
session.close();
....
user.setAge(new Integer(27));
session = sessionFactory.openSession();    
tx= session.beginTransaction(); 
session.update(user);
tx.commit();
session.close();



Session提供了一个saveOrUpdate()方法,为数据的储存或更新提供了一个统一的操作接口,藉由定义映像文件时,设定< id>标签的unsaved-value来决定什么是新的值必需,什么是已有的值必须更新: 

<idname="id" column="id"type="java.lang.Integer" unsaved-value="null">
    <generator class="native"/> 
</id> 


unsaved-value可以设定的值包括: 

·        any:总是储存

·        none:总是更新

·        null:id为null时储存(预设)

·        valid:id为null或是指定值时储存


这样设定之后,您可以使用Session的saveOrUpdate()方法来取代update()方法。

  • 合并状态

以这边的例子来说:

Session session =sessionFactory.openSession();
Transaction tx =session.beginTransaction();
User user1 =(User) session.get(User.class, new Integer(2));
tx.commit();
session.close();
....
user1.setAge(newInteger(27));

session =sessionFactory.openSession();    
tx=session.beginTransaction(); 
User user2 = (User)session.get(User.class, new Integer(2)); // 同一个id
// user1 == user2 为 false
session.update(user1); // 丢出NonUniqueObjectException
tx.commit();
session.close();



在进行update()之前,您就先从数据库中取得另一笔 资料,之后再尝试更新user1,由于目前的Persistence context已加载一笔资料,并有同一个id的User 实例了,同一个Persistencecontext不会有两个相同id的对象实例,因此丢出NonUniqueObjectException。

就这边的例子来说,您应该使用merge()而不是update():

Session session =sessionFactory.openSession();
Transaction tx =session.beginTransaction();
User user1 =(User) session.get(User.class, new Integer(2));
tx.commit();
session.close();
....
user1.setAge(newInteger(27));

session =sessionFactory.openSession();    
tx=session.beginTransaction(); 
User user2 = (User)session.get(User.class, new Integer(2)); // 同一个id
User user3 =(User) session.merge(user1);
// user1 == user2 为 false
// user2 == user3 为 true
tx.commit();
session.close();


merge()会将user1与user2的状态合并,传回的对象实例就是user2原先所参考的实例。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值