hibernate 总结
-
1、加入junit.jar
2、新建一个工具类HibernateUtils.Java把一些对session的公共操作封装起来
- public class HibernateUtils {
- /*
- *读取Hibernate.cfg.xml文件
- */
- private static SessionFactory factory;
- static {
- try {
- //读取hibernate.cfg.xml文件
- Configuration cfg = new Configuration().configure();
- //建立SessionFactory
- factory = cfg.buildSessionFactory();
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- /*
- *打开Session
- */
- public static Session getSession() {
- return factory.openSession();
- }
- /*
- *关闭Session
- */
- public static void closeSession(Session session) {
- if (session != null) {
- if (session.isOpen()) {
- session.close();
- }
- }
- }
- public static SessionFactory getSessionFactory() {
- return factory;
- }
- }
- public class test extends TestCase {
- /*
- * 增加User
- */
- public void testSave() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- User user = new User();
- user.setName("李四");
- user.setPassword("123");
- user.setCreateTime(new Date());
- user.setExpireTime(new Date());
- session.save(user);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- /**
- * 删除
- */
- public void testDel(){
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- User user=(User)session.load(User.class, "4028989545a244640145a24466300001");
- session.delete(user);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- /**
- * 修改
- */
- public void testUpdate(){
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- User user=(User)session.load(User.class, "4028989545a243ca0145a243cbf80001");
- user.setName("王五");
- session.update(user);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- /**
- * 查询
- */
- public void testLoad(){
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- User user=(User)session.load(User.class, "4028989545a243ca0145a243cbf80001");
- System.out.println(user.getName());
- System.out.println(user.getId());
- System.out.println(user.getPassword());
- System.out.println(user.getClass());
- System.out.println(user.getCreateTime());
- System.out.println(user.getExpireTime());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- }
- load, get区别:
load返回的代理对象, 真正用到对象时才发出sql语句,
get直接从数据库加载,发出sql语句, 不会延迟.
所以load必须在commit之前执行getName方法的操作.
但是get放在commit之前之后都可以.
@Test
public
void
testLoad() {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.load(Teacher.
class
,
1
);
//此数字是ID
System.out.println(t.getName());
session.getTransaction().commit();
//System.out.println(t.getClass());
}
@Test
public
void
testGet() {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher)session.get(Teacher.
class
,
1
);
session.getTransaction().commit();
//System.out.println(t.getClass());
System.out.println(t.getName());
}
学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及 detached(离线状态),大家伙也许也知道这三者之间的区别,比如瞬时状态就是刚new出来一个对象,还没有被保存到数据库中,持久化状态就是已经 被保存到数据库中,离线状态就是数据库中有,但是session中不存在该对象。但是大家又是否对hibernate的session的那几个特殊方法一 清二楚呢?或者说大家是否能够一眼就快速看出一个测试用例在反复的调用session的诸如save,update方法后会到底发出多少条SQL语句呢? 本篇随笔将会给你答案,本篇随笔将会以大量的测试用例来掩饰hibernate的这三种状态的转变,相信看完本篇随笔的你会对hibernate的那三种 状态有更深入的理解。
好了,废话不多说了,相信大家都知道hibernate的这三种状态的含义,那我们就通过一张图来开始我们的深入hibernate的三种状态之旅吧。
session = HibernateUtil.openSession();
session.beginTransaction();
User user = new User();
user.setUsername("aaa");
user.setPassword("aaa");
user.setBorn(new Date()); /* * 以上user就是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的 * 缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象 * user就变成了一个Persistent(持久化对象) */ session.save(user); session.getTransaction().commit();