• (二)hibernate进阶


    1.hibernate.cfg.xml常用配置
    以上节代码为例
    <session-factory>
        
        <property name="connection.username">root</property>
        <property name="connection.password">123</property>
        <property name="connection.driver.class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">create</property>
        
        <mapping resource="Students.hbm.xml" /> 
        </session-factory>

    hbm2ddl.auto:如何将数据生成的表插入数据库
      create:覆盖原表(删除原表,重新生成)
      update:更新(原有的表结构不会被删除)
      create-drop:先生成,后删除。
      validate:将现有的表结构和原有的表结构进行验证,如果不同,就不创建新的表结构。
    default_schema:填写数据库名
      生成的SQL语句中会在表名和表结构之前加上数据库名。
    2.session简介
    首先要明白Hibernate是对JDBC的一个封装,所以不建议使用jdbc的connection操作数据库,而是通过使用session操作数据库。
    2.1. 所以Session可以理解为操作数据库的对象。要使用Hibernate操作数据库,就先要获得Session的实例。
    2.2. session与connection,是多对一的关系。每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
    2.3. 把对象保存在关系数据库中需要调用session的各种方法,如:save(),update(),delete(),createQuery()等。

    要特别注意的是:当执行某一个Session对象的方法时,必须要开启一个事务。也就是说,这些方法要封装在事务中。在执行这些方法之后要提交事务,再关闭Session。

    结合上节代码:
    package hibernate_01;
    
    
    import java.util.Date;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    import org.hibernate.service.ServiceRegistryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    //测试的源程序要写在新建的Source Folder里 
    
    //测试类
    public class StudentsTest {
    
        private SessionFactory sessionFactory;
        private Session session;
        private Transaction transaction;
        
        @Before
        public void init(){
            //创建配置对象
            Configuration config =new Configuration().configure();
            //创建服务注册对象
            ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
            //创建会话工厂对象
            sessionFactory=config.buildSessionFactory(serviceRegistry);
            //会话对象
            session =sessionFactory.openSession();
            //开启事务
            transaction =session.beginTransaction();
            
            
        }
        
        @After
        public void destory(){
            transaction.commit();//提交事务
            session.close();//关闭会话
            sessionFactory.close();//关闭会话工厂
        }
        
        
        @Test
        public void testSaveStudents(){
            
            //生成学生对象
            Students s=new Students(1,"张三","男",new Date(),"山东");
            //保存对象进数据库
            session.save(s);
        }
            
    }
    3.transaction简介

    3.1  hibernate默认不自动提交事务,将<2.session简介>中测试类   StudentsTest  中的的事务相关代码注释

    
    
    //开启事务
            //transaction =session.beginTransaction();
    
    
    @After
        public void destory(){
            //transaction.commit();//提交事务

    运行后控制台如下输出(没有insert 代码)

    说明表输入失败

    要想不开启事务向数据库加入数据,可采用如下方法:

    在save()方法之前带调用doWork()方法,重写其execute()方法,设置自动提交,最后不要忘了session提交后用flush()方法强制输出sql语句。

    @Test
        public void testSaveStudents(){
            
            //生成学生对象
            Students s=new Students(1,"张三","男",new Date(),"山东");
            
            session.doWork(new Work(){
    
                @Override
                public void execute(Connection connection) throws SQLException {
                    // TODO Auto-generated method stub
                    connection.setAutoCommit(true);
                }   
            });
            //保存对象进数据库
            session.save(s);
            //强制输出sql语句
            session.flush();
        }    

     控制台输出sql语句,表结构创建完成。

    4.session详解
    4.1. 获得session对象的两种方法
    package hibernate_01;
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;//不要导错了
    import org.hibernate.service.ServiceRegistryBuilder;
    import org.junit.Test;
    
    public class SessionTest {
    
        //为方便,将所有方法写在@Test里
        @Test
        public void testOpenSession(){
            //获得配置对象
            Configuration config = new Configuration().configure();
            //获得服务注册对象
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
            //获得sessionFactory对象
            SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
            //获得session对象
            Session session =sessionFactory.openSession();
            
            if(session!=null){
                System.out.println("session创建成功!");
            }else{
                System.out.println("session创建失败!");
            }
        }
        
        
        @Test
        public void testGetCurrentSession(){
            //获得配置对象
                    Configuration config = new Configuration().configure();
                    //获得服务注册对象
                    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
                    //获得sessionFactory对象
                    SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
                    //获得session对象
                    Session session =sessionFactory.getCurrentSession();
                    
                    if(session!=null){
                        System.out.println("session创建成功!");
                    }else{
                        System.out.println("session创建失败!");
                    }
                }
        }
        

    getCurrentSession配置本地事务(在hibernate.cfg.xml文件中进行配置 )

    
    
    <propertyname="hibernate.current_session_context_class">thread</property>
    
    

         4.2.两种方法的区别

        4.2.1 验证openSession()方法创建对象hashCode不同

    @Test
        public void testSaveStudentsWithOpenSession(){
             //获得配置对象
            Configuration config = new Configuration().configure();
            //获得服务注册对象
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
            //获得sessionFactory对象
            SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
            //获得session对象
            Session session1=sessionFactory.openSession();
            //开启事务
            Transaction transaction = session1.beginTransaction();
            //生成一个学生对象
            Students s=new Students(1,"李四","男",new Date(),"北京");
            session1.doWork(new Work(){
    
                @Override
                public void execute(Connection connection) throws SQLException {
                    // TODO Auto-generated method stub
                    System.out.println("connection hashCode:" +connection.hashCode());
                }
                
            });
            session1.save(s);
    //        session1.close();
            transaction.commit();//提交事务
            
                    Session session2=sessionFactory.openSession();
                    transaction = session2.beginTransaction();
                    s=new Students(2,"王五","男",new Date(),"武汉");//表的主键问题要主意
                    session2.doWork(new Work(){
    
                        @Override
                        public void execute(Connection connection) throws SQLException {
                            // TODO Auto-generated method stub
                            System.out.println("connection hashCode:" +connection.hashCode());
                        }
                        
                    });
                    session2.save(s);
                    transaction.commit();//提交事务
            
        }

        4.2.2 创建 session方式不同

    Session session1 =sessionFactory.openSession();
    Session session2
    =sessionFactory.openSession(); System.out.println(session1==session2); //false
    Session session1 =sessionFactory.getCurrentSession();
    Session session2 =sessionFactory.getCurrentSession();
                    
    System.out.println(session1==session2);  //true
    5.对象关系映射(hbm文档)常用配置
    5.1 mapping标签

    5.2 class标签

    5.3  id标签

    5.4  主键生成策略



  • 相关阅读:
    odoo 自定义视图
    Odoo 模型之间的关系 笔记
    C#中计算两点之间连线的角度
    Jquery中1.6.x中新的方法prop()方法
    VS2010快捷键说明
    将DATAtable转换成 json格式
    在IIS中执行EXE文件时的问题
    WebDev.WebServer40.exe已停止工作
    sqllite developer过期解决方案
    c#的DateTime.Now函数详解
  • 原文地址:https://www.cnblogs.com/zjfjava/p/6592277.html
Copyright © 2020-2023  润新知