一般将针对数据库的操作放在事物里面,
开始事物:session.beginTransaction();
获取事物:session.getTransaction();
提交事物:transaction.commit();
事物回滚:transaction.rollback();
提交事物和事物回滚中的transaction使用session.getTransaction()获得。
我是这样使用的:
Transaction transaction=session.beginTransaction(); try{ session.save(student); transaction.commit(); }catch(Exception e){ System.out.println("插入数据失败"); transaction.rollback(); }
增:
使用session.save(p);
p为持久化类的实例对象
删:
分两步,先查再删。
首先找到要针对操作的持久化对象。可以使用session.get()和session.load()方法得到,也可以直接声明现成的实例化对象
public void delete(int id){ //删 session=getSession(); session.beginTransaction(); try{ //Student s=session.load(Student.class, id); Student s=new Student(); s.setId(2); s.setName("张三"); s.setDescription("一个顽皮的孩子!"); session.delete(s); session.getTransaction().commit(); }catch(Exception e){ System.out.println("删除数据失败"); session.getTransaction().rollback(); } }
改:
也是分为两步,前面查,后面改
两种方式:
1、session.flush()
改主要是先使用对象属性的set()针对该持久化对象的值的覆盖,然后使用session.flush()进行强制刷新
注意:改操作的持久化类对象必须是查询出来的,否则不起效果
demo:
public void change(){ //改 session=getSession(); Transaction transaction=session.beginTransaction(); try{ Student s=session.load(Student.class, 1); s.setName("guodaxia"); s.setDescription("a bad boy!"); s.setId(1); session.flush();//强制刷新提交 transaction.commit(); }catch(Exception e){ System.out.println("删除数据失败"); transaction.rollback(); } }
2、使用session.update(Object obj)方法
obj不限定是必须查询出来的,可以使用实例化的合适对象
demo:
public void change(){ //改 Transaction transaction=session.beginTransaction(); try{ /*Student s=session.load(Student.class, 1); s.setName("guodaxia"); s.setDescription("a bad boy!"); s.setId(1); session.flush();//强制刷新提交 */ Student s=new Student(); s.setId(1); s.setName("daxia"); s.setDescription("a good boy!"); session.update(s); transaction.commit(); }catch(Exception e){ System.out.println("更改数据失败"); transaction.rollback(); } }
查:
已知标志列:
使用session.get()或者session.load()方法
语法相似,demo:
public void query(int id){ //查 Transaction transaction=session.beginTransaction(); try{ //Student s=(Student)session.get(Student.class, id);//使用get() Student s=session.load(Student.class, id); System.out.println("s.id:"+s.getId()); System.out.println("s.name:"+s.getName()); System.out.println("s.description:"+s.getDescription()); transaction.commit(); }catch(Exception e){ System.out.println("查询数据失败"); transaction.rollback(); } }
get()和load()的区别:
检索不到结果:load()抛出NotFoundException,get()返回null
检索机制:get()先查询一级缓存,再查询数据库,load()先在session一级缓存上查找,再在二级缓存中查找,最后查找数据库。load方法支持延迟加载lazy(这个我不太熟)
根本区别:load()使用的是代理对象,get()使用的是实体类对象。什么是代理对象?代理对象只有在实际使用该对象的时候才会才会进行再二级缓存或数据库的查询
观察:
在前面的demo中观察分别使用load()和get()方法时候的输出的id和sql语句的顺序可以发现代理对象是只有针对对应的对象操作的时候才会执行数据库等的查询
demo:
package com.hibernate.manager; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import com.hibernate.bean.Student; import com.util.HibernateUtil; public class StudentManager { private static final ThreadLocal<Session> threadLocal=new ThreadLocal<Session>(); static SessionFactory sessionFactory=HibernateUtil.getSessionFactory(); static Session session=null; public static Session getSession(){ Session session=(Session)threadLocal.get(); if(session==null||session.isOpen()==false){ if(sessionFactory==null){ rebuildSessionFactory(); } session=sessionFactory!=null?sessionFactory.openSession():null; threadLocal.set(session); } return session; } private static void rebuildSessionFactory() { sessionFactory=new Configuration().configure().buildSessionFactory(); } public static void main(String[] args){ session=getSession(); StudentManager sm=new StudentManager(); /*Student s=new Student(); s.setId(2); s.setName("张三"); s.setDescription("一个顽皮的孩子!"); sm.add(s);*/ //sm.query(2); //sm.delete(2); //sm.change(); sm.query(1); } public void add(Student student){ //增 Transaction transaction=session.beginTransaction(); try{ session.save(student); transaction.commit(); }catch(Exception e){ System.out.println("插入数据失败"); transaction.rollback(); } } public void delete(int id){ //删 session.beginTransaction(); try{ Student s=session.load(Student.class, id); /*Student s=new Student(); s.setId(2); s.setName("张三"); s.setDescription("一个顽皮的孩子!");*/ session.delete(s); session.getTransaction().commit(); }catch(Exception e){ System.out.println("删除数据失败"); session.getTransaction().rollback(); } } public void change(){ //改 Transaction transaction=session.beginTransaction(); try{ Student s=session.load(Student.class, 1); s.setName("guodaxia"); s.setDescription("a bad boy!"); s.setId(1); session.flush();//强制刷新提交 transaction.commit(); }catch(Exception e){ System.out.println("删除数据失败"); transaction.rollback(); } } public void destory(){ session.close(); } public void query(int id){ //查 Transaction transaction=session.beginTransaction(); try{ Student s=(Student)session.get(Student.class, id);//使用get() Student s1=(Student)session.get(Student.class, id); //Student s=session.load(Student.class, id); //Student s1=session.load(Student.class, id); System.out.println("s.id:"+s.getId()); System.out.println("s.name:"+s.getName()); System.out.println("s.description:"+s.getDescription()); System.out.println("s1.id:"+s1.getId()); System.out.println("s1.name:"+s1.getName()); System.out.println("s1.description:"+s1.getDescription()); transaction.commit(); }catch(Exception e){ System.out.println("查询数据失败"); transaction.rollback(); } } }
总结:
session.sava(Object obj);
session.delete(Object obj);
session.update(Object obj);||先查询对应的数据库中的映射对象,setXXX()进行修改,再session.flush()强制提交
session.get(Class cls,ID id) ||session.load(Class cls,ID id)
使用查询语句查询见后文。