Hibernate——Session(二)详解

来源:互联网 发布:淘宝自由搭配套餐 功能 编辑:程序博客网 时间:2024/04/30 11:37

(一)session对数据库的操作

创建相应的数据库表

[java] view plaincopy
  1. create table user(id int not null primary key auto_increment,username varchar(50),userpass varchar(50));  

数据库对应三个字段,id,用户名,用户密码

项目的Entity类为User

[java] view plaincopy
  1. public class User {  
  2.     private int id;  
  3.     private String username;  
  4.     private String userpass;  
  5.     public int getId() {  
  6.         return id;  
  7.     }  
  8.     public void setId(int id) {  
  9.         this.id = id;  
  10.     }  
  11.     public String getUsername() {  
  12.         return username;  
  13.     }  
  14.     public void setUsername(String username) {  
  15.         this.username = username;  
  16.     }  
  17.     public String getUserpass() {  
  18.         return userpass;  
  19.     }  
  20.     public void setUserpass(String userpass) {  
  21.         this.userpass = userpass;  
  22.     }  
  23. }  


1.增

新建一个java web项目,导入相应的jar包,建立相应的model包,新建一个User类,建立相应的User.hbm.xml文件

[java] view plaincopy
  1. public class Test {  
  2.     public static void main(String args[]) {  
  3.         Configuration config = new Configuration()  
  4.                 .configure("/hibernate.cfg.xml");  
  5.         SessionFactory sessionFactory = config.buildSessionFactory();  
  6.         Session session = sessionFactory.openSession();  
  7.         Transaction tx = session.beginTransaction();  
  8.         User user = new User();  
  9.         user.setUsername("乔丹");  
  10.         user.setUserpass("123");  
  11.         session.save(user);  
  12.         tx.commit();  
  13.     }  
  14.   
  15. }  

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

[java] view plaincopy
  1. public class Test {  
  2.     public static void main(String args[]) {  
  3.         Session session = HibernateSessionFactory.getSession();  
  4.         Transaction tx = session.beginTransaction();  
  5.         User user = (User) session.get(User.classnew Integer(2));  
  6.         session.delete(user);  
  7.         tx.commit();  
  8.         session.close();  
  9.     }  
  10. }  

3.改(更新)

[java] view plaincopy
  1. <span style="font-size:13px;">public class Test {  
  2.     public static void main(String args[]) {  
  3.         Session session = HibernateSessionFactory.getSession();  
  4.         Transaction tx = session.beginTransaction();  
  5.         User user = (User) session.get(User.classnew Integer(2));  
  6.         tx.commit();  
  7.         <span style="color:#33cc00;">session.close();  
  8. </span>     user.setUsername("皮蓬");  
  9.         session = HibernateSessionFactory.getSession();      
  10.         tx= session.beginTransaction();   
  11.         <span style="color:#ff0000;">session.update(user);  
  12. </span>     tx.commit();  
  13.         session.close();  
  14.   
  15.     }  
  16. }</span>  

session关闭后,需要重新得到一个新的session对数据进行处理。

4.查

您使用get()或load()方法取得id为2的对象

如果未能发现相符合的资料,则get()方法会返回null,而load()方法会丢出ObjectNotFoundException,在进阶的应用中,load()方法可以返回代理(proxy)物件,在必要时才真正查询资料库取得对应资料,并可充分利用快取机制。
在Hibernate 3中,取消了find()方法,您必须透过Query或Criteria来进行资料查询。

[java] view plaincopy
  1. public class Test {  
  2.     public static void main(String args[]) {  
  3.         Session session = HibernateSessionFactory.getSession();  
  4.         Transaction tx = session.beginTransaction();  
  5.         User user = (User) session.get(User.classnew Integer(2));  
  6.         tx.commit();  
  7.         session.close();  
  8.   
  9.     }  
  10. }  


合并状态

[java] view plaincopy
  1. public class Test {  
  2.     public static void main(String args[]) {  
  3.         Session session = HibernateSessionFactory.getSession();  
  4.         Transaction tx = session.beginTransaction();  
  5.         User user = (User) session.get(User.classnew Integer(2));  
  6.         tx.commit();  
  7.         session.close();  
  8.         user.setUsername("罗德曼");  
  9.   
  10.         session = HibernateSessionFactory.getSession();      
  11.         tx= session.beginTransaction();   
  12.         User user2 = (User) session.get(User.classnew Integer(2)); // 同一个id  
  13.         // user1 == user2 为 false  
  14.         session.update(user); // 丢出NonUniqueObjectException  
  15.         tx.commit();  
  16.         session.close();  
  17.   
  18.     }  
  19. }  


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

[java] view plaincopy
  1. public class Test {  
  2.     public static void main(String args[]) {  
  3.         Session session = HibernateSessionFactory.getSession();  
  4.         Transaction tx = session.beginTransaction();  
  5.         User user = (User) session.get(User.classnew Integer(2));  
  6.         tx.commit();  
  7.         session.close();  
  8.         user.setUsername("罗德曼");  
  9.   
  10.         /*session = HibernateSessionFactory.getSession();     
  11.         tx= session.beginTransaction();  
  12.         User user2 = (User) session.get(User.class, new Integer(2)); // 同一个id 
  13.         // user1 == user2 为 false 
  14.         session.update(user); // 丢出NonUniqueObjectException 
  15.         tx.commit(); 
  16.         session.close();*/  
  17.         session=HibernateSessionFactory.getSession();  
  18.         tx=session.beginTransaction();  
  19.         User user2=(User)session.get(User.class,new Integer(2));  
  20.         User user3=(User)session.merge(user);  
  21.         tx.commit();  
  22.         session.close();  
  23.   
  24.     }  
  25. }  

(二)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()等方法,把脱管对象变为持久对象。

 

0 0
原创粉丝点击