Hibernate的升级&&Query用法

Posted 岁月无虞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate的升级&&Query用法相关的知识,希望对你有一定的参考价值。

一、基本概念
1、Configuration:

    概述: Configuration类负责管理Hibernate的配置信息。启动Hibernate、创建SessionFactory对象。

      (1)  Hibernate运行的底层配置信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。

      (2)  Hibernate对象关系映射文件(*.hbm.xml) 。

   Hibernate配置的两种方法:

     (1)属性文件( (hibernate.properties) 
                 调用代码:Configuration cfg = new Configuration();
     (2)XML文件(hibernate.cfg.xml) 。
                 调用代码:Configuration cfg = new Configuration().configure();
                 configrure()方法默认读hibernate.cfg.xml

2.SessionFactory:

   概述:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。

      (1) SessionFactory是线程安全的(Thread-Safe),可以让多个执行线程同时存取SessionFactory而不会有数据共享的问题。
      (2) 会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
      (3) 需要注意的是SessionFactory是重量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够(单例模式),当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
   调用代码: SessionFactory sessionFactory =cfg.buildSessionFactory();

3.Session 

  概述:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流)
      (1)Session也称为持久化管理器,因为它是与持久化有关的操作接口。
      (2)Session不是线程安全的,应该避免多个线程共享同一个Session实例。
      (3)Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
      (4)保证在一个线程中仅存在一个Session实例
                    getCurrentSession (Hibernate 3+)
                    可以采用ThreadLocal的办法.(Hibernate 2)
                    把Session对象放在方法内部定义.
   它与Web层的HttpSession没有任何关系。

4.Transaction(事务)

    概述: Transaction接口负责事务相关的操作。
          它将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。

          这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。

   调用代码:
Transaction tx = session.beginTransaction();tx.commit();l提交事务
.…..
tx.rollback();  //回滚事务
注:使用Hibernate进行操作时(增、删、改)必须显示的调用Transaction(默认: autoCommit=false) 。

5.Query

   概述:
Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。

  调用代码:
Query query = session.createQuery("fromUser");

二、使用步骤
1.实现SessionFactory的单态模式
在cn.hrbust.dao包下创建HibernateUtil.java类

package cn.hrbust.dao;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    private static Configuration cfg=null;
    private static SessionFactory sf=null;
    static    { //在类加载的时候只能执行一次
        try {
            cfg=new Configuration().configure();
            sf=cfg.buildSessionFactory();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static SessionFactory getSessionFactory(){
        return sf;//去返回SessionFactory
    }
    public void closeSessionFactory(){
        sf.close();//关闭SessionFactory
    }
}
manageUser就变为:

public class manageUser{
public static void main(String[] args){
        Configuration cfg=null;
        SessionFactory sf=null;
        Session session=null;
        Transaction ts=null;
        User u=new User();
        u.setName("1814010833");
        u.setGender("女");
        u.setAge(21);
        u.setBirthday(Date.valueOf("2000-2-5"));
        try {
            sf=HibernateUtil.getSessionFactory(); //sessionFactory的单态模式
            session=sf.openSession();
            ts=session.beginTransaction();
            session.save(u);
            ts.commit();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            if(ts!=null){
                ts.rollback();
                }
            }finally{
            session.close();
            sf.close();
            }
        }
}

 
2.之前用openSession的方式去打开持久化管理器,Hibernate3之后推荐用getCurruntSession来打开session,并且这种方式保证线程安全
使用getCurrentSession需要在配置文件中加入<property name="hibernate.current_session_context_class">thread</property>

<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/l....
-->
<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.mysqlInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hellohibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.current_session_context_class">thread</property><!-- 保证每个读写线程有唯一的session实例 -->
    <property name="show_sql">true</property>
    <mapping resource="cn/hrbust/pojo/User.hbm.xml"/>
</session-factory>

</hibernate-configuration>
配置好后将session=sf.openSession();改为session=sf.getCurrentSession();

public class manageUser{
public static void main(String[] args){
        Configuration cfg=null;
        SessionFactory sf=null;
        Session session=null;
        Transaction ts=null;
        User u=new User();
        u.setName("1814010833");
        u.setGender("女");
        u.setAge(21);
        u.setBirthday(Date.valueOf("2000-2-5"));
        try {
            sf=HibernateUtil.getSessionFactory(); //sessionFactory的单态模式
            session=sf.getCurrentSession();//保证每个读写线程有唯一的session实例
            ts=session.beginTransaction();
            session.save(u);
            ts.commit();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            if(ts!=null){
                ts.rollback();
                }
            }finally{ //当用getCurrentSession的时候可以自动关闭
            //session.close();
            //sf.close();
            }
        }
}
 

3.事务
如果不提交,则仅仅是发出语句,但是事务没有被提交,所以数据库里并没有,所以必须要显示开启事务,即ts.commit必须要加才可以生效

4.Query
(1)扩展功能:单独测试方法:

保存用户对象:

public class manageUser extends TestCase{
public void testSavaUser(){

    Configuration cfg=null;
    SessionFactory sf=null;
    Session session=null;
    Transaction ts=null;
    User u=new User();
    u.setName("哈哈哈");
    u.setGender("男");
    u.setAge(30);
    u.setBirthday(Date.valueOf("2000-2-5"));
    try {
        sf=HibernateUtil.getSessionFactory(); //sessionFactory的单态模式
        session=sf.getCurrentSession();//保证每个读写线程有唯一的session实例
        ts=session.beginTransaction();
        session.save(u);
        ts.commit();
    } catch (HibernateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        if(ts!=null){
            ts.rollback();
            }
        }finally{
        //session.close();
        //sf.close();
        }
}

}
 

(2)查询用户对象:

public class manageUser extends TestCase{
public void testQueryUser(){

    Configuration cfg=null;
    SessionFactory sf=null;
    Session session=null;
    Transaction ts=null;

    try {
        sf=HibernateUtil.getSessionFactory(); //sessionFactory的单态模式
        session=sf.getCurrentSession();//保证每个读写线程有唯一的session实例
        ts=session.beginTransaction();
        Query query=session.createQuery("from User");
        List<User> users =query.list();

// for的第一种方式
// for(int i=0;i<users.size();i++){
// User u=users.get(i);
// System.out.println(u.getName()+" "+u.getAge());
// }
// for的另一种方式

        for(User u:users){
            System.out.println(u.getName()+" "+u.getAge());
        }
        
        ts.commit();
    } catch (HibernateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        if(ts!=null){
            ts.rollback();
            }
        }finally{
        //session.close();
        //sf.close();
        }
}

}

以上是关于Hibernate的升级&&Query用法的主要内容,如果未能解决你的问题,请参考以下文章

2018.10.6 Hibernate配置文件详解-------ORM元数据配置 &&& hibernate主配置文件

[Hibernate]Access to DialectResolutionInfo cannot be null when &#39;hibernate.dialect&#39; n

一 Mybatis概述&与Hibernate的区别&CRUD

ES-聚合操作

SSH系列-- hibernate基本原理&&入门demo

ORM简介 && MyBatis和Hibernate的不同 && 动态代理简单实现Mybatis基本使用