zoukankan      html  css  js  c++  java
  • 20160505-hibernate入门2

    基本概念和CURD
    开发流程
    1由Domain object -> mapping->db。(官方推荐)
    2由DB开始,用工具生成mapping和Domain object。(使用较多)
    3由映射文件开始。
    Domain Object限制
    1.默认的构造方法(必须的)。
    2有无意义的标示符id(主键)(可选)
    3非final的,对懒加载有影响(可选)
    Domain Java Object(User)
     
    public class User {
        private int id;
        private String name;
        private Date birthDay;
    
        //getter setter…
    }
    Java代码
    1.初始化代码(只做一次)
     
    Configuration cfg = new Configuration();
         cfg.configure(“config.cfg.xml”);
        // 也可以通过cfg.setProperty设置属性。
         SessionFactory sessionFactory = cfg.buildSessionFactory();

    所以将以上代码封装成工具类:

    HibernateUtils.java

    package com.dzq.utils;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUntils {
        private static SessionFactory sessionFactory;
    
        private HibernateUntils() {
    
        }
    
        static {
            Configuration cfg = new Configuration();
            cfg.configure();//如果不是hibernate.cfg.xml这个文件名,需要加上文件名
            sessionFactory = cfg.buildSessionFactory();
        }
        public static SessionFactory getSessionFactory(){
            return sessionFactory;
        }
        public static Session getSession(){
            return sessionFactory.openSession();
        }
    }
    工具类的使用:
     public static void addUser(User user){
          Session s=null;
          Transaction tx=null;
          try {
            s=HibernateUntils.getSession();
            tx=s.beginTransaction();
            s.save(user);
            tx.commit();
        } catch (Exception e) {
         if(tx!=null)
             tx.rollback();
         throw new RuntimeException(e);
        }finally{
            if(s!=null){
                s.close();
            }
        }
      }
    Session的几个主要方法
    1.save,persist保存数据,persist在事务外不会产生insert语句。
    2.delete,删除对象
    3.update,更新对象,如果数据库中没有记录,会出现异常。
    4.get,根据ID查,会立刻访问数据库。
    5.Load,根据ID查,(返回的是代理,不会立即访问数据库)。
    6.saveOrUpdate,merge(根据ID和version的值来确定是save或update),调用merge你的对象还是托管的。
    7.lock(把对象变成持久对象,但不会同步对象的状态)。
     
    对象状态
    瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。
    持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)
    脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到。
     
     
     工具类完善:
    HibernateUtils.java
    package com.dzq.utils;
    
    import java.io.Serializable;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUntils {
        private static SessionFactory sessionFactory;
    
        private HibernateUntils() {
    
        }
    
        static {
            Configuration cfg = new Configuration();
            cfg.configure();//如果不是hibernate.cfg.xml这个文件名,需要加上文件名
            sessionFactory = cfg.buildSessionFactory();
        }
        public static SessionFactory getSessionFactory(){
            return sessionFactory;
        }
        public static Session getSession(){
            return sessionFactory.openSession();
        }
        
        
        /**
         * 添加
         * @param entity
         */
        public static void add(Object entity) {
            Session s = null;
            Transaction tx = null;
            try {
                s = HibernateUntils.getSession();
                tx = s.beginTransaction();
                s.save(entity);
                tx.commit();
            } catch (Exception e) {
                if (tx != null)
                    tx.rollback();
                throw new RuntimeException(e);
            } finally {
                if (s != null) {
                    s.close();
                }
            }
        }
        /**
         * 修改
         * @param entity
         */
        public static void update(Object entity) {
            Session s = null;
            Transaction tx = null;
            try {
                s = HibernateUntils.getSession();
                tx = s.beginTransaction();
                s.update(entity);
                tx.commit();
            } catch (Exception e) {
                if (tx != null)
                    tx.rollback();
                throw new RuntimeException(e);
            } finally {
                if (s != null) {
                    s.close();
                }
            }
        }
        
        /**
         * 删除
         * @param entity
         */
        public static void delete(Object entity) {
            Session s = null;
            Transaction tx = null;
            try {
                s = HibernateUntils.getSession();
                tx = s.beginTransaction();
                s.delete(entity);
                tx.commit();
            } catch (Exception e) {
                if (tx != null)
                    tx.rollback();
                throw new RuntimeException(e);
            } finally {
                if (s != null) {
                    s.close();
                }
            }
        }
        
        /**
         * 根据主键id查询
         * @param clazz
         * @param id
         * @return
         */
        public static Object get(Class clazz,Serializable id) {
            Session s = null;
            try {
                s = HibernateUntils.getSession();
                Object obj=s.get(clazz, id);
                return obj;
            }  finally {
                if (s != null) {
                    s.close();
                }
            }
        }
    }
     
  • 相关阅读:
    Linux 学习之DNS服务器
    Windows系统镜像自动添加驱动程序
    Linux下集群的搭建
    Heartbeat+LVS构建高可用负载均衡集群
    Keepalived高可用集群搭建(转载linuxIDC)
    CentOS 7.x设置自定义开机启动,添加自定义系统服务
    代码改变世界
    Vim食用指南
    Hibernate三种状态详解
    MySQL服务器的安装与配置
  • 原文地址:https://www.cnblogs.com/xiaoduc-org/p/5463011.html
Copyright © 2011-2022 走看看