关于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方法可以转换成持久化对象,其中的关系,图中也有了详细的信息,,多看一下图,也可以多尝试的做几个例子,。就可以熟能生巧了~!