免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1340 | 回复: 0
打印 上一主题 下一主题

hibernate核心技术 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-15 21:26 |只看该作者 |倒序浏览

hibernate开发流程:
1.配置文件:
  @.properties格式的
  @.xml格式的(常用hibernate.cfg.xml)(放在src下面或者是wen-inf\classes下面)
SessionFactory sf=new Configuration().configure().buildSessionFactory();
   或者SessionFactory sf=new Configuration().configure("db.cfg.xml").buildSessionFactory();
2.编写映射文件:
  例如:User.hbm.xml
  映射文件的编写有很多内容,可以采用相关的根据自动生成映射文件,在这里就不介绍了
3.写持久化类:
  例如:User.java
4.在编写DAO之前先写HibernateSessionFactory类
package com.wuxiaoxiao.hibernate;
import org.hibernate.Session;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Configuration;
public class HibernateSessionFactory{
private static final String CONFIG_FILE_LOCATION="/hibernate.cfg.xml";
private static final ThreadLocal threadLocal=new ThreadLocal();
private static final Configuration cfg=new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
//取得session
public static Session currentSession()throws HibernateException{
Session session=threadLocal.get();
if(session==null){
   if(sessionFactory==null){
      try{
       cfg.configuration(CONFIG_FILE_LOCATION);
sessionFactory=cfg.buildSessionFactory();
      }catch(Exception e){
        System.err.println("%%%Error Creating SessionFactory %%%%");
e.printStackTrace();
      }
   }
session=sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
//关闭session
public static void closeSession()throws HibernateException{
Session session=(Session)threadLocal.get();
threadLocal.set(null);
if(session!=null)
  session.close();
}
}
threadLocal是thread local variable,为每一个访问它的线程都提供一个变量值的副本,是每一个线程都可以独立的改变自己的副本,而不会和其他线程的副本冲突。ThreadLocal有三个主要的方法:initValue()初始化变量值,get(),set(Object)
例子:

public class ConnectionFactory{
private fianl String URL="jdbc:mysql://localhsot/mysatabase";
private static ThreadLocalConnection> connectionHolder=new ThreadLocalConnection>(){
public COnnection initValue(){
try{
return DriverManager.getConnection(URL);}catch(Exception e){}
}
};
public Connection getConnection(){
return connectionHolder.get();
}
}
5.编写DAO
  例如:
public User getUser(String username)throws HibernateException{
Session session=null;
Transaction tx=null;
User user=null;
try{
session=HibernateSessionFactory.currentSession();
tx=session.beginTransaction();
Query query=session.createQuery("from User where username=?");
query.setString(0,username.trim());
user=(User)query.uniqueResult();
query=null;
tx.commit();
}catch(HibernateException e){throw e;
}finally{
if(tx!=null)
  tx.rollback();
HibernateSessionFactory.closeSession();
}
return user;
}
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()保存对象,使之成为持久化

Session session=HibernateSessionFactory.currentSession();
User user=new User();
user.setName("wuxiaoxiao");
user.setPassword(123456);
session.save(user);
@使用load()装在对象
User user=(User)session.load(User.class,new Integer(1));
若对象不存在就会抛出无法修复的异常
@使用get()装在对象
User user=(User)session.get(User.class,new Integer(4));
若对象不存在的话,就返回null
@使用flush()强制提交刷新
User user=(User)session.get(User.class,new Integer(4));
user.setUsername("ranran");
user.setPassword("123456");
session.flush();
对user的更新是在同一个session中,不需要用update()或者saveOrUpdate()
@使用delete()移除持久化对象
User user=(User)session.get(User.class,new Integer(4));
session.delete(user);
session.flush();
@使用update()方法提交托管状态的对象
update()用于根据给定的托管对象实例的标示更新对应的持久化实例!如果传入一个持久化对象,那么update()方法就是多余的。如果传入临时状态的对象就会出错,除非认为的给临时地给对象指定一个id。不管传入的是什么状态的对象,数据库中必须要有一条记录与这个对象的id相对应,否则抛出异常!
@saveOrUpdate()传递的对象在数据库中若存在就更新,否则就插入!他和update()主要是处理托管状态的对象!

@使用refresh()强制装在对象,如果数据库中使用了触发器来处理对象的而某些属性,这个方法就更有用了!
session.save(user);
session.flush();
session.refresh(user);
使用Transaction管理事务
例子:如上面编写DAO的例子
使用Query进行HQL查询
@不带参数的查询
Query query=session.createQuery("from User");
@带参数的查询
Query query=session.createQuery("from User where username=:username");
query.setString("username","wuxiaoxiao");
或者
List names=new ArrayList();
names.add("wuxiaoxiao");
names.add("ranran");
Query query=session.createQuery("from User where username in (:namelist)");
query.setParameterList("namelist",names);
或者
Query query=session.createQuery("from User where username=?");
query.setSrting(0,"wuxiaoxiao");
@取得list结果集
List list=query.list();
@取得迭代列表结果集
Iterator iterator1=query.iterator();
或者
Iterator iterator2=query.list().iterator();
while(iterator.hasNext())
User user=(User)iterator2.next();
@取得一个对象
Query query=session.createQuery("from User where username=?");
query.setString(0,"wuxiaoxiao");
User user=(User)query.uniqueResult();
@标量查询
Iterator results = sess.createQuery(
        "select user.name,count(user.email) from User user " +
        "group by user.name")
        .list()
        .iterator();
        
while ( results.hasNext() ) {
    Object[] row = (Object[]) results.next();
    String type = (String) row[0];
    Integer count = (Integer) row[1];
    .....
}
@分页查询
Query q = sess.createQuery("from DomesticCat cat");
q.setFirstResult(20);
q.setMaxResults(10);
List cats = q.list();
@创建sql查询
使用Criteria进行条件查询
  略.............


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/76927/showart_1416591.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP