关于hibernate的,另外一些应用!

---恢复内容开始---

首先在在原来的搭建的基础上,建上一个测试类,其中的目的就是实现一些简单的增删改查,好的,现在我来代码贴上!对了,其中的测试类,就是junit这个的创建就不需要多说了!

  

    public void testSave2() {
        Configuration cfg = new Configuration().configure();//读取配置文件
        SessionFactory sf = cfg.buildSessionFactory();//建立工厂的sessionfactory其中的配置文件中有
        Session session = sf.openSession();// 找到其中的session并且打开
        Transaction ts = session.getTransaction();//数据库事务声明
        try {
            ts.begin();
            
            User user = new User();
            user.setUsername("daijianwei");//这一段是主要的数据库的操作的
            user.setPassword("woaini");
            session.save(user);
            
            ts.commit();
        } catch (HibernateException e) {
            ts.rollback();//假如上面的的数据操作没有操作成功,就需要事物的回滚,不然的会会报异常!
        }finally{
            session.close();
        }
    }

通过执行上面的操作,就可以在原来创建的表中插入一条数据,其中的注释,我也写上来,主要要注意的是回滚事物,意思就是在没有操作成功的时候,进行事物的回滚!
  在这里,要进行说明一下,如果你在配置文件中有一条这样的语句,Hbm2dd.cuto 其中的代码,我贴上来,<property name="hbm2ddl.auto">update</property>

这句话表示的意思就是只有的更新的时候,才会对表进行操作,而不是你每次执行一次操作,就创建一张表,这是 需要特别注意的地方,如果你需要每次都执行一次,就创建一张表的话,把update换成create就行了。

  上面的代码,是有重复性的,我每次进行操作的时候只要读取一次配置文件就行了,所有上面的 Configuration 和 SessionFactory可以进行封装的操作,也就是建立一个工具类!,工具类的代码,我也写好了,贴上代码来看看。

package com.daijianwei.util;

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

public class HibernateUtil {
    private static Configuration cfg;//定义成私有的,并且也是static的
    private static SessionFactory sf;//定义成私有的,也是static的
    
    private HibernateUtil(){}//私有的构造方法
    static{
        cfg = new Configuration().configure();
        sf = cfg.buildSessionFactory();//初始化成员变量
    }
    
    public static Session getSession(){
        return sf.getCurrentSession(); //提供拿到session的方法
        
    }
}

对了,这里我用的sf.getCurrentSession()这个方法,这里也就需要解释一下吧,就比如,农行有农行的系统,工行有工行的系统,两者的系统时不同的,但是要实现转账的时候,中间要用的连接是不是两者都共同有的,现在,我在测试类的中的session和在工具类中的session是不同的,所以,我就需要拿到相同的session,可以很方便进行操作,也就是JTA管理远程事物,也就是我们现在所说的sf.getCurrentSession()这个方法,使用这个方法要注意的2点,第一点,我们使用的sf.getCurrentSession()在工具类,而在测试类中,我们是不能关闭的session的。第二点,在配置文件中,我们也需要对sf.getCurrentSession()这个方法进行配置,配置的语句代码,我也贴出来。很简单一句<property name="current_session_context_class">thread</property>

以上的两点就是需要注意的地方!

  接下来,就是在测试类当中的具体应用了,测试类中应用,贴上代码可以看一下!

  

public void testSave() {
        Session session = null;
        Transaction ts = null;
        try {
            session = HibernateUtil.getSession();//拿到session
            ts = session.getTransaction();//建立数据库的事物
            ts.begin();
            /*User user = new User();
            user.setUsername("jack5");
            user.setId(1);
            user.setPassword("123");
            session.save(user);*/
            User u1 = (User) session.load(User.class, 2);//通过方法拿到当前的id为2的对象
            
            session.evict(u1);
            System.out.println(u1.getUsername());//通过拿到的对象来进行一系列的操作
            ts.commit();
            
        } catch (Exception e) {
            
                ts.rollback();
            
        }
        
    }
    

在这里需要注意的几个地方,通过拿到的id为的对象那个方法,一个是session.get()和session.load();两个方法,两个方法有一些很大的不同。其中在get方法中方法执行的时候,会马上发出sql语句,从而得出真实的对象。而load()方法使用了lazy(懒加载,或者叫做延迟加载)机制,当执行的时候,不会发生sql语句,得到代理对象只是在使用的时候,才会发生sql语句。为什么要有这两个方法,其中在load方法中,有一个明显的好处就是;利用了懒加载的,可以明显的减少服务器的压力!因为有些用户,他的请求可能是在一半的时候就会终止掉,这个时候,就没有必要接着往下执行了,如果你还接着往下执行,就照成服务器的资源浪费的问题了。。所以就很没有必要!

  接下来,来看看hibernate当中一些瞬时,持久化,和离线当中的三者,关系,这里还是来看看其中的一张图,。这张图就很好的说明其中的关系

 图中的三个属性,一个瞬时属性,瞬时属性就是通过对象来new 出来的,数据库没有,session没有。代码我也贴出来!

package com.daijianwei.Test2;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.daijianwei.po.User;
import com.daijianwei.util.HibernateUtil;

public class HiberTest {

    @Test
    public void testSave() {
        Session session = null;
        Transaction ts = null;
        try {
            session = HibernateUtil.getSession();//拿到session
            ts = session.getTransaction();//建立数据库的事物
            ts.begin();
            User user = new User();
            user.setUsername("jack5");
            user.setId(1);
            user.setPassword("123");
            session.save(user);
            /*User u1 = (User) session.load(User.class, 2);//通过方法拿到当前的id为2的对象
            
            session.evict(u1);
            System.out.println(u1.getUsername());//通过拿到的对象来进行一系列的操作
*/            ts.commit();
            
        } catch (Exception e) {
            
                ts.rollback();
            
        }
        
    }
    
    
    @Test
    public void testSave2() {
        Configuration cfg = new Configuration().configure();//读取配置文件
        SessionFactory sf = cfg.buildSessionFactory();//建立工厂的sessionfactory其中的配置文件中有
        Session session = sf.openSession();// 找到其中的session并且打开
        Transaction ts = session.getTransaction();//数据库事务声明
        try {
            ts.begin();
            
            User user = new User();
            user.setUsername("daijianwei");//这一段是主要的数据库的操作的
            user.setPassword("woaini");
            session.save(user);
            
            ts.commit();
        } catch (HibernateException e) {
            ts.rollback();//假如上面的的数据操作没有操作成功,就需要事物的回滚,不然的会会报异常!
        }finally{
            session.close();
        }
    }
    
}

其中上面的就是通过new出来的瞬时对象,瞬时对象通过save方法,就会变成持久化对象,,所以也可以简单的理解,在hibernate当中也就没有简单的数据库的增删改查的概念,就是几种对象的转换,
  了解瞬时对象,接下来,我们来看看持久化对象,最明显的一个特点,就是在数据库和session中都有,所以他是和session和数据库同步的,你就可以对他进行一些修改的操作,。并且操作的结果都是和数据库当中同步的,我也把代码贴出来看看,

User u1 = (User) session.load(User.class, 2);//通过方法拿到当前的id为2的对象
            
            session.evict(u1);
            System.out.println(u1.getUsername());//通过拿到的对象来进行一系列的操作

在hibernate当中,全部都是对象的感念,都是拿到id为几的对象,
  了解了持久化对象,接下来,我们来看看离线对象,离线对象,就是在session没有了,在数据库中还有着,。我也做一个例子来看看这个离线对象,请看代码

User u1 = (User) session.load(User.class, 2);//通过方法拿到当前的id为2的对象
            
            session.close();
            System.out.println(u1.getUsername());

这样的操作是没有用的,程序是肯定会报错的,因为在session当中已经关闭了,就不可能在对这个对象进行任何的操作了,对了,是通过close这个方法进行转换的,另外离线对象通过update方法可以转换成持久化对象,其中的关系,图中也有了详细的信息,,多看一下图,也可以多尝试的做几个例子,。就可以熟能生巧了~!

  

原文地址:https://www.cnblogs.com/daijianwei/p/3131349.html