Hibernate——Session(二)详解
来源:互联网 发布:微信刷票软件 编辑:程序博客网 时间:2024/04/30 09:18
上一篇文章讲了如何得到session,这篇文章对session对数据库的操作和session的三种状态进行介绍。
(一)session对数据库的操作
创建相应的数据库表
- create table user(id int notnull primary key auto_increment,username varchar(50),userpass varchar(50));
create table user(id int not null primary key auto_increment,username varchar(50),userpass varchar(50));
数据库对应三个字段,id,用户名,用户密码
项目的Entity类为User
- public class User {
- private int id;
- private String username;
- private String userpass;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getUserpass() {
- return userpass;
- }
- public void setUserpass(String userpass) {
- this.userpass = userpass;
- }
- }
public class User {private int id;private String username;private String userpass;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getUserpass() {return userpass;}public void setUserpass(String userpass) {this.userpass = userpass;}}
1.增
新建一个java web项目,导入相应的jar包,建立相应的model包,新建一个User类,建立相应的User.hbm.xml文件
- public class Test {
- public staticvoid main(String args[]) {
- Configuration config = new Configuration()
- .configure("/hibernate.cfg.xml");
- SessionFactory sessionFactory = config.buildSessionFactory();
- Session session = sessionFactory.openSession();
- Transaction tx = session.beginTransaction();
- User user = new User();
- user.setUsername("乔丹");
- user.setUserpass("123");
- session.save(user);
- tx.commit();
- }
- }
public class Test {public static void main(String args[]) {Configuration config = new Configuration().configure("/hibernate.cfg.xml");SessionFactory sessionFactory = config.buildSessionFactory();Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();User user = new User();user.setUsername("乔丹");user.setUserpass("123");session.save(user);tx.commit();}}
save()之后,不会马上对资料库进行更新,而是在Transaction的commit()之后才会对数据库进行更新,在Transaction之间的操作要就全部成功,要就全部失败,如果更新失败,则在资料库层面会撤消所有更新操作,然而记忆体中的持久物件是不会回复原有状态的,事实上,当 Transaction失败,这一次的Session就要马上跟着失效,放弃所有记忆体中的物件,而不是尝试以原物件再进行更新的动作。
2.删
- public class Test {
- public staticvoid main(String args[]) {
- Session session = HibernateSessionFactory.getSession();
- Transaction tx = session.beginTransaction();
- User user = (User) session.get(User.class,new Integer(2));
- session.delete(user);
- tx.commit();
- session.close();
- }
- }
public class Test {public static void main(String args[]) {Session session = HibernateSessionFactory.getSession();Transaction tx = session.beginTransaction();User user = (User) session.get(User.class, new Integer(2));session.delete(user);tx.commit();session.close();}}
3.改(更新)
- <SPAN style="FONT-SIZE: 13px">publicclass Test {
- public staticvoid main(String args[]) {
- Session session = HibernateSessionFactory.getSession();
- Transaction tx = session.beginTransaction();
- User user = (User) session.get(User.class,new Integer(2));
- tx.commit();
- <SPAN style="COLOR: #33cc00">session.close();
- </SPAN> user.setUsername("皮蓬");
- session = HibernateSessionFactory.getSession();
- tx= session.beginTransaction();
- <SPAN style="COLOR: #ff0000">session.update(user);
- </SPAN> tx.commit();
- session.close();
- }
- }</SPAN>
<span style="FONT-SIZE: 13px">public class Test {public static void main(String args[]) {Session session = HibernateSessionFactory.getSession();Transaction tx = session.beginTransaction();User user = (User) session.get(User.class, new Integer(2));tx.commit();<span style="color:#33cc00;">session.close();</span>user.setUsername("皮蓬");session = HibernateSessionFactory.getSession(); tx= session.beginTransaction(); <span style="color:#ff0000;">session.update(user);</span>tx.commit();session.close();}}</span>
session关闭后,需要重新得到一个新的session对数据进行处理。
4.查
您使用get()或load()方法取得id为2的对象
如果未能发现相符合的资料,则get()方法会返回null,而load()方法会丢出ObjectNotFoundException,在进阶的应用中,load()方法可以返回代理(proxy)物件,在必要时才真正查询资料库取得对应资料,并可充分利用快取机制。
在Hibernate 3中,取消了find()方法,您必须透过Query或Criteria来进行资料查询。
- public class Test {
- public staticvoid main(String args[]) {
- Session session = HibernateSessionFactory.getSession();
- Transaction tx = session.beginTransaction();
- User user = (User) session.get(User.class,new Integer(2));
- tx.commit();
- session.close();
- }
- }
public class Test {public static void main(String args[]) {Session session = HibernateSessionFactory.getSession();Transaction tx = session.beginTransaction();User user = (User) session.get(User.class, new Integer(2));tx.commit();session.close();}}
合并状态
- public class Test {
- public staticvoid main(String args[]) {
- Session session = HibernateSessionFactory.getSession();
- Transaction tx = session.beginTransaction();
- User user = (User) session.get(User.class,new Integer(2));
- tx.commit();
- session.close();
- user.setUsername("罗德曼");
- session = HibernateSessionFactory.getSession();
- tx= session.beginTransaction();
- User user2 = (User) session.get(User.class,new Integer(2));// 同一个id
- // user1 == user2 为 false
- session.update(user); // 丢出NonUniqueObjectException
- tx.commit();
- session.close();
- }
- }
public class Test {public static void main(String args[]) {Session session = HibernateSessionFactory.getSession();Transaction tx = session.beginTransaction();User user = (User) session.get(User.class, new Integer(2));tx.commit();session.close();user.setUsername("罗德曼");session = HibernateSessionFactory.getSession(); tx= session.beginTransaction(); User user2 = (User) session.get(User.class, new Integer(2)); // 同一个id// user1 == user2 为 falsesession.update(user); // 丢出NonUniqueObjectExceptiontx.commit();session.close();}}
在进行update()之前,您就先从资料库中取得另一笔资料,之后再尝试更新user1,由于目前的Persistence context已载入一笔资料,并有同一个id的User 实例了,同一个Persistence context不会有两个相同id的物件实例,因此丢出NonUniqueObjectException。
- public class Test {
- public staticvoid main(String args[]) {
- Session session = HibernateSessionFactory.getSession();
- Transaction tx = session.beginTransaction();
- User user = (User) session.get(User.class,new Integer(2));
- tx.commit();
- session.close();
- user.setUsername("罗德曼");
- /*session = HibernateSessionFactory.getSession();
- tx= session.beginTransaction();
- User user2 = (User) session.get(User.class, new Integer(2)); // 同一个id
- // user1 == user2 为 false
- session.update(user); // 丢出NonUniqueObjectException
- tx.commit();
- session.close();*/
- session=HibernateSessionFactory.getSession();
- tx=session.beginTransaction();
- User user2=(User)session.get(User.class,new Integer(2));
- User user3=(User)session.merge(user);
- tx.commit();
- session.close();
- }
- }
public class Test {public static void main(String args[]) {Session session = HibernateSessionFactory.getSession();Transaction tx = session.beginTransaction();User user = (User) session.get(User.class, new Integer(2));tx.commit();session.close();user.setUsername("罗德曼");/*session = HibernateSessionFactory.getSession(); tx= session.beginTransaction(); User user2 = (User) session.get(User.class, new Integer(2)); // 同一个id// user1 == user2 为 falsesession.update(user); // 丢出NonUniqueObjectExceptiontx.commit();session.close();*/session=HibernateSessionFactory.getSession();tx=session.beginTransaction();User user2=(User)session.get(User.class,new Integer(2));User user3=(User)session.merge(user);tx.commit();session.close();}}
(二)session的三种状态
瞬态:
由new命令开辟内存空间的新对象,也就是创建model层的类对象
User user = new User();
瞬态的特点:
1)对象没有和session关联
2)在数据库中没有和瞬态对象关联的对象
持久状态:
持久的实例在数据库中有对应的几率,并拥有一个持久化标识(identifier)
持久化对象总是与Session和Transaction相关联,在一个Session中,对持久化对象的改变不会马上对数据库进行变更,而必须在Transaction终止,也就是执行commit()之后,才在数据库中真正运行SQL进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象成为脏(dirty)对象。
瞬态转换为持久对象:
1)通过Session的save()和saveOrUpdate()方法把一个瞬时对象与数据库相关联,这个瞬时对象就成为持久化对象。
持久化对象的特点:
(1)和Session实例关联
(2)在数据库中有和持久对象关联的记录
3.托管状态(Detached)
与持久对象关联的Session被关闭后,对象就像变成了脱管对象。对脱管对象的引用依然有效,对象可继续被修改。
托管对象的特点:
1)本质上和瞬态对象相同
2)只是比瞬态对象多了一个数据库标志值id
持久对象转换为脱管对象:
当执行close()或者clear(),evict()之后,持久对象变为脱管对象。
瞬态对象转为持久对象
通过Session的update(),saveOrUpadate和lock()等方法,把脱管对象变为持久对象。
- Hibernate——Session(二)详解
- Hibernate——Session(二)详解
- Hibernate——Session(二)详解
- Hibernate——Session(二)详解
- Hibernate(二)session详解
- Hibernate进阶篇(二)——session简介
- Hibernate进阶篇(四)——session详解
- Hibernate——Session详解(一)
- Hibernate——Session详解(一)
- Hibernate——Session详解(一)
- Hibernate复习笔记(3)——Session缓存(Hibernate一级缓存)详解
- Hibernate 中Session 体会(二)
- Hibernate 缓存 之 Session 实现(二)
- Hibernate接口Session详解
- Hibernate的Session详解
- 详解Hibernate Session
- 详解Hibernate Session
- 详解Hibernate Session & Transaction
- [Accessibility] Missing contentDescription attribute on image!!!
- 第四章作业
- 深入研究boost::shared_ptr
- IOS_AVFoundation_石头剪刀布_i18n国际化
- 一个终结是另一个开始
- Hibernate——Session(二)详解
- sql server 存储过程的优化.(变量表,临时表的简单分析)
- android ksoap调用天气预报
- 图形学
- 【C语言复习(十一)】#pragma编译指示字相关使用
- windows phone 7 之Pivot控件
- OOAD学习总结
- 好的ListView adapter
- IOS_多线程_GET_POST_AFN_上传下载_视频播放