Hibernate的重要技术简介

开发 后端
Hibernate技术session操纵数据库@对象的状态:瞬时(Transient) - 由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的。

Hibernate技术有很多值得学习的地方,这里我们主要介绍Hibernate技术的一些强大功能,包括Hibernate技术技术开发流程等方面。

Hibernate技术开发流程:

1.配置文件:

@.properties格式的

@.xml格式的(常用hibernate.cfg.xml)(放在src下面或者是wen-inf\classes下面)

  1. SessionFactory sf=new Configuration().configure().buildSessionFactory();  
  2.  
  3.    或者SessionFactory sf=new Configuration().configure("db.cfg.xml").buildSessionFactory();   

2.编写映射文件:

例如:User.hbm.xml 映射文件的编写有很多内容,可以采用相关的根据自动生成映射文件,在这里就不介绍了

3.写持久化类:

例如:User.java

4.在编写DAO之前先写HibernateSessionFactory类

  1. package com.wuxiaoxiao.hibernate;  
  2. import org.hibernate.Session;  
  3. import org.hibernate.HibernateException;  
  4. import org.hibernate.cfg.Configuration;  
  5. public class HibernateSessionFactory{  
  6. private static final String CONFIG_FILE_LOCATION="/hibernate.cfg.xml";  
  7. private static final ThreadLocal threadLocal=new ThreadLocal();  
  8. private static final Configuration cfg=new Configuration();  
  9. private static org.hibernate.SessionFactory sessionFactory;  
  10. //取得session  
  11.  
  12. public static Session currentSession()throws HibernateException{  
  13. Session session=threadLocal.get();  
  14. if(session==null){  
  15.    if(sessionFactory==null){  
  16.       try{  
  17.        cfg.configuration(CONFIG_FILE_LOCATION);  
  18. sessionFactory=cfg.buildSessionFactory();  
  19.       }catch(Exception e){  
  20.         System.err.println("%%%Error Creating SessionFactory %%%%");  
  21. e.printStackTrace();  
  22.       }   
  23.    }  
  24. session=sessionFactory.openSession();  
  25. threadLocal.set(session);  
  26. }  
  27. return session;  
  28. }   
  29. //关闭session  
  30.  
  31. public static void closeSession()throws HibernateException{  
  32. Session session=(Session)threadLocal.get();  
  33. threadLocal.set(null);  
  34. if(session!=null)  
  35.   session.close();  
  36. }  
  37. }  

threadLocal是thread local variable,为每一个访问它的线程都提供一个变量值的副本,是每一个线程都可以独立的改变自己的副本,而不会和其他线程的副本冲突。ThreadLocal有三个主要的方法:initValue()初始化变量值,get(),set(Object)例子:

  1. public class ConnectionFactory{  
  2. private fianl String URL="jdbc:mysql://localhsot/mysatabase";  
  3. private static ThreadLocal<Connection> connectionHolder=new ThreadLocal<Connection>(){  
  4. public COnnection initValue(){  
  5. try{  
  6. return DriverManager.getConnection(URL);}catch(Exception e){}  
  7. }  
  8. };  
  9. public Connection getConnection(){  
  10. return connectionHolder.get();  
  11. }  
  12. }  

5.编写DAO例如:

  1. public User getUser(String username)throws HibernateException{  
  2. Session session=null;  
  3. Transaction tx=null;  
  4. User user=null;  
  5. try{  
  6. session=HibernateSessionFactory.currentSession();  
  7. tx=session.beginTransaction();  
  8. Query query=session.createQuery("from User where username=?");  
  9. query.setString(0,username.trim());  
  10. user=(User)query.uniqueResult();  
  11. query=null;  
  12. tx.commit();  
  13. }catch(HibernateException e){throw e;  
  14. }finally{  
  15. if(tx!=null)  
  16.   tx.rollback();  
  17. HibernateSessionFactory.closeSession();  
  18. }  
  19. return user;  
  20. }  

6.编写service类

public boolean valid(String username,String password){}

下面主要介绍session操纵数据库@对象的状态:

Hibernate定义并支持下列对象状态(state):

瞬时(Transient) - 由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。 如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)

持久(Persistent) - 持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。

脱管(Detached) - 在数据库中存在记录,但不与session关联!与持久(Persistent)对象关联的Session被关闭后,对象就变为脱管(Detached)的。 对脱管(Detached)对象的引用依然有效,对象可继续被修改。脱管(Detached)对象如果重新关联到某个新的Session上, 会再次转变为持久(Persistent)的(在Detached其间的改动将被持久化到数据库)。 这个功能使得一种编程模型,即中间会给用户思考时间(user think-time)的长时间运行的操作单元(unit of work)的编程模型成为可能。 我们称之为应用程序事务,即从用户观点看是一个操作单元(unit of work)

@使用sve()保存对象,使之成为持久化

  1. Session session=HibernateSessionFactory.currentSession();  
  2. User user=new User();  
  3. user.setName("wuxiaoxiao");  
  4. user.setPassword(123456);  
  5. session.save(user);  

@使用load()装在对象

  1. User user=(User)session.load(User.class,new Integer(1));  

若对象不存在就会抛出无法修复的异常

@使用get()装在对象

  1. User user=(User)session.get(User.class,new Integer(4));  

若对象不存在的话,就返回null @使用flush()强制提交刷新

  1. User user=(User)session.get(User.class,new Integer(4));  
  2. user.setUsername("ranran");  
  3. user.setPassword("123456");  
  4. session.flush();  
  5.    

对user的更新是在同一个session中,不需要用update()或者saveOrUpdate()

@使用delete()移除持久化对象

  1. User user=(User)session.get(User.class,new Integer(4));  
  2. session.delete(user);  
  3. session.flush();  
  4.  

@使用update()方法提交托管状态的对象

update()用于根据给定的托管对象实例的标示更新对应的持久化实例!如果传入一个持久化对象,那么update()方法就是多余的。如果传入临时状态的对象就会出错,除非认为的给临时地给对象指定一个id。不管传入的是什么状态的对象,数据库中必须要有一条记录与这个对象的id相对应,否则抛出异常!

@saveOrUpdate()传递的对象在数据库中若存在就更新,否则就插入!他和update()主要是处理托管状态的对象!
 
@使用refresh()强制装在对象,如果数据库中使用了触发器来处理对象的而某些属性,这个方法就更有用了!

  1. session.save(user);  
  2. session.flush();  
  3. session.refresh(user);  

使用Transaction管理事务

例子:如上面编写DAO的例子 使用Query进行HQL查询 @不带参数的查询

  1. Query query=session.createQuery("from User");  

@带参数的查询

  1. Query query=session.createQuery("from User where username=:username");  
  2. query.setString("username","wuxiaoxiao");  
  3. 或者  
  4. List names=new ArrayList();  
  5. names.add("wuxiaoxiao");  
  6. names.add("ranran");  
  7. Query query=session.createQuery("from User where username in (:namelist)");  
  8. query.setParameterList("namelist",names);  
  9. 或者  
  10. Query query=session.createQuery("from User where username=?");  
  11. query.setSrting(0,"wuxiaoxiao");  

@取得list结果集

 List list=query.list();

@取得迭代列表结果集

  1. Iterator iterator1=query.iterator();  
  2. 或者  
  3. Iterator iterator2=query.list().iterator();  
  4. while(iterator.hasNext())  
  5.  User user=(User)iterator2.next();  

@取得一个对象

  1. Query query=session.createQuery("from User where username=?");  
  2. query.setString(0,"wuxiaoxiao");  
  3. User user=(User)query.uniqueResult();  
  4.    

@标量查询

  1. Iterator results = sess.createQuery(  
  2.         "select user.name,count(user.email) from User user " +  
  3.         "group by user.name")  
  4.         .list()  
  5.         .iterator();  
  6.           
  7. while ( results.hasNext() ) {  
  8.     Object[] row = (Object[]) results.next();  
  9.     String type = (String) row[0];  
  10.     Integer count = (Integer) row[1];  
  11.     .....  

@分页查询

  1. Query q = sess.createQuery("from DomesticCat cat");  
  2. q.setFirstResult(20);  
  3. q.setMaxResults(10);  
  4. List cats = q.list(); 

@创建sql查询

使用Criteria进行条件查询

  略.............

【编辑推荐】

  1. Hibernate入门学习宝典
  2. Hibernate属性简单分析
  3. Struts-Spring-Hibernate案例
  4. 简述Hibernate配置连接池
  5. 对Hibernate中get()与load()不同点分析
责任编辑:仲衡 来源: chinaunix
相关推荐

2009-09-24 16:53:47

Hibernate A

2009-06-02 17:18:10

hibernate框架简介

2009-09-27 09:46:45

Hibernate会话

2009-09-29 17:00:08

Hibernate c

2009-09-21 13:19:06

Hibernate s

2009-06-30 14:08:00

Hibernate缓存

2009-06-26 16:19:32

Hibernate实现

2009-06-12 14:40:38

Hibernate AHibernate接口

2009-09-08 09:37:03

LINQ重要组成部分

2009-02-11 09:37:32

Hibernate分页技术JSP

2009-06-22 15:39:00

java技术简介

2011-03-24 11:37:41

Hibernate

2009-09-25 08:49:22

Hibernate集合

2016-04-07 09:39:17

LPWAN物联网

2016-12-26 15:55:08

技术思维评估

2009-09-22 16:49:42

Hibernate分页

2011-11-04 12:56:55

无线USB

2019-05-09 13:00:34

DevOps

2009-09-25 10:17:21

Hibernate延迟

2009-09-25 14:23:39

点赞
收藏

51CTO技术栈公众号