1. -------------
Configuration
-------------
①:主要用来加载配置并解析配置
②:通过Configuration对象获取SessionFactory对象
--->1,Configuration对象提供了很多额外的通过API配置hibernate的方式(add...);
--->2,buildSessionFactory虽然已经过期了,但是仍然是使用最广泛的得到sessionfactory的方法
--->3,新的sessionFactory方法:
sessionFactory =cfg.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry());
具体代码:
Configuration config=new Configuration().configure(); SessionFactory SessionFactory = config.buildSessionFactory();
2. --------------
sessionFactory
--------------
①:sessionFactory是用来创建session对象的;
②:openSession:开启一个全新的Session;
具体代码:
SessionFactory SessionFactory = config.buildSessionFactory(); Session session = SessionFactory.openSession();
3. -------
Session
-------
session对象提供了对象持久化的各种方法:
1) beginTransaction:开启一个事务;
2) save(object):保存一个对象;
public void save(Teacher tc) { Session session = null; try { // 加载hibernate.cfg.xml文件 Configuration config = new Configuration().configure(); // 获取session session = config.buildSessionFactory().openSession(); // 开始事务 session.beginTransaction(); // 保存对象 session.save(tc); // 事务提交 session.getTransaction().commit(); // 关闭资源 } catch (HibernateException e) { e.printStackTrace(); Transaction transaction = session.beginTransaction(); if (transaction.isActive()) { transaction.rollback(); } } finally { if (session != null && session.isOpen()) { session.close(); } } }
3) get(Class,Serializable):根据主键加载一个指定类型的对象实例;
public Teacher get(Teacher tc) { Configuration config=new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session openSession = sessionFactory.openSession(); return (Teacher) openSession.get(Teacher.class, tc.getId()); }
4) update(object):修改一个对象,要求对象需要有id等值;
public void update(Teacher tc) { Configuration config=new Configuration().configure(); SessionFactory SessionFactory = config.buildSessionFactory(); Session session = SessionFactory.openSession(); Transaction transaction = session.beginTransaction(); session.update(tc); transaction.commit(); session.close(); }
5) delete(object):删除一个对象,要求对象必须有id;
public void delete(Teacher tc) { Session session = null; Transaction beginTransaction = null; try { session = HibernateUtils.getSession(); beginTransaction = session.beginTransaction(); session.delete(tc); beginTransaction.commit(); } catch (Exception e) { e.printStackTrace(); if (beginTransaction.isActive()) { beginTransaction.rollback(); } } finally { if (session != null && session.isOpen()) { session.close(); } } }
6) createQuery(String hql):创建一个查询对象;
public List<?> list() { Configuration config=new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session openSession = sessionFactory.openSession(); Query createQuery = openSession.createQuery("FROM Teacher"); return createQuery.list(); }
7) close():关闭一个session;
8) saveOrUpdate:保存没有id的对象,修改有id的对象;
public void saveOrUpdate(Teacher tc) { // 利用saveOrUpdate添加对象 // 如果要使用saveOrUpdate, // 要么没有id, 要么使用已经在数据库中存在的id Configuration config=new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session openSession = sessionFactory.openSession(); Transaction transaction = openSession.beginTransaction(); openSession.saveOrUpdate(tc); transaction.commit(); openSession.close(); }
9) persist:
①) 把对象保存到数据库中;
②) persist方法要执行,必须在事务空间之内;
public void testPersist() throws Exception { Session session = HibernateUtil.getInstance().getSession();//自己封装的获取session的方法 session.beginTransaction(); Student stu = new Student("小花1", 16); session.persist(stu); session.getTransaction().commit(); session.close(); }
10)merge:
①) 相当于update方法;
②) merge方法要执行,必须在事务空间之内;
11)load
1) get方法,在调用get方法的时候就会立刻去发送一条SELECT查询,如果没有结果,返回null,如果有结果,返回对象,
2) load方法和get一样,也能够查询指定id的对象;
3) load方法把真正执行select延后到了使用这个对象的时候,我们叫做延迟加载;
`使用`: 在使用对象非主键属性的时候;
* load方法的原理:
1: load方法返回的对象是hibernate动态为我们的domain创建的一个子类;
2: hibernate在这个子类里面重写了非主键的属性的getter方法,和tostring方法;
3: hibernate为这个子类添加了一个(是否加载完成)的状态;如果在调用这个对象的getter方法的时候,这个对象还没有被加载,就发送SQL去查询对象,并且把查 询到的结果设置到对象中,并设置是否加载完成状态为[加载完成];如果之后再去调用getter方法,因为已经加载完成了所以,只需要直接返回这些属性的值就可 以了;
4: hibernate使用javassist来完成延迟加载子类的动态生成;
5: 如果在session关闭之前没有去实例化延迟加载对象
6: 用load方法返回的对象永远不可能为空;
7: 如果load方法返回的对象在使用的过程中发现数据库里面没有值对应,报错;
8: 如果要使用load方法,请保证id在数据库中一定存在;
4. -----------
Transaction
-----------
* 对事务的一个封装,事务的提交或者回滚由这个对象管理;
* 常用的几个方法:
session.getTransaction:得到当前会话上绑定的事务对象;
session.beginTransaction:在标记当前session的事务正常开始了;
transaction.isActive:判断当前事务是否是活动的;
session.isOpen:判断当前session处于打开状态;