zoukankan      html  css  js  c++  java
  • 【Hibernate】(2)Hibernate配置与session、transaction

    1. Hibernate经常使用配置


    使用hibernate.default_schema属性能够让全部生成的表都带一个指定的前缀。


    2. session简单介绍

    不建议直接使用jdbc的connection操作数据库,而是通过使用session操作数据库。

    session能够理解为操作数据库的对象。session与connection是多对一的关系。每一个session都有一个与之相应的connection。一个connection不同一时候刻能够供多个session使用。把对象保存在关系数据库中须要调用session的各种方法,如save(),update(),delete(),createQuery()等。


    3. transaction简单介绍

    hibernate对数据的操作都是封装在事务其中,而且默认是非自己主动提交的方式。所以用session保存对象时。假设不开启事务,而且手工提交事务。对象并不会真正保存在数据库中。

    假设想让hibernate像jdbc那样自己主动提交事务,必须调用session对象的doWork()方法。获得jdbc的connection后。设置其为自己主动提交事务模式。

    比如:

    		session.doWork(new Work() {
    
    			@Override
    			public void execute(Connection conn) throws SQLException {
    				conn.setAutoCommit(true);
    			}
    
    		});
    		session.save(s1); // 保存对象进入数据库
    		session.flush();
    注意一定不能忘记flush()方法。

    4. session具体解释

    获取session对象的两种方式:

    (1). SessionFactory的openSession()方法

    (2) SessionFactory的getCurrentSession()方法 

    假设使用getCurrentSession须要在hibernate.cfg.xml文件里进行配置:

    假设是本地事务(jdbc事务)

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

    假设是全局事务(jta事务)

    		<property name="hibernate.current_session_context_class">jta</property>
    openSession和getCurrentSession的差别:

    (1). getCurrentSession在事务提交或者回滚之后会自己主动关闭,而openSession须要你手动关闭。假设使用openSession而没有手动关闭。多次之后就会导致连接池溢出。

    (2). openSession每次创建新的session对象,而getCurrentSession使用现有的session对象。

    	@Test
    	public void testSaveStudentWithOpenSession() {
    		// 获得配置对象
    		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();
    		// 生成一个学生对象
    		Student s = new Student(1, "李四", "男", new Date(), "北京");
    		session1.doWork(new Work() {
    
    			@Override
    			public void execute(Connection conn) throws SQLException {
    				System.out.println("Connection的hashCode:" + conn.hashCode());
    			}
    		});
    		session1.save(s);
    		// session1.close();
    		// 提交事务
    		transaction.commit();
    
    		// 新创建一个session提交
    		Session session2 = sessionFactory.openSession();
    		transaction = session2.beginTransaction();
    		s = new Student(2, "王五", "男", new Date(), "上海");
    		session2.doWork(new Work() {
    
    			@Override
    			public void execute(Connection conn) throws SQLException {
    				System.out.println("Connection的hashCode:" + conn.hashCode());
    			}
    		});
    		session2.save(s);
    		transaction.commit();
    	}
    
    	@Test
    	public void testSaveStudentWithGetCurrentSession() {
    		// 获得配置对象
    		Configuration config = new Configuration().configure();
    		// 获得服务注冊对象
    		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
    				.applySettings(config.getProperties()).buildServiceRegistry();
    		// 获得SessionFactory对象
    		SessionFactory sessionFactory = config
    				.buildSessionFactory(serviceRegistry);
    		// 获得Session对象
    		Session session1 = sessionFactory.getCurrentSession();
    		// 开启事物
    		Transaction transaction = session1.beginTransaction();
    		// 生成一个学生对象
    		Student s = new Student(1, "李四", "男", new Date(), "北京");
    		session1.doWork(new Work() {
    
    			@Override
    			public void execute(Connection conn) throws SQLException {
    				System.out.println("Connection的hashCode:" + conn.hashCode());
    			}
    		});
    		session1.save(s);
    		// session1.close();
    		// 提交事务
    		transaction.commit();
    
    		// 新创建一个session提交
    		Session session2 = sessionFactory.getCurrentSession();
    		transaction = session2.beginTransaction();
    		s = new Student(2, "王五", "男", new Date(), "上海");
    		session2.doWork(new Work() {
    
    			@Override
    			public void execute(Connection conn) throws SQLException {
    				System.out.println("Connection的hashCode:" + conn.hashCode());
    			}
    		});
    		session2.save(s);
    		transaction.commit();
    	}
    通过样例我们能够看出在不关闭session的情况下,使用openSession每一次获得的都是新的session,而使用getCurrentSession获得的都是同一个session,所以在使用openSession获得的session操作完成后。须要手动close掉。


    5. hbm配置文件经常使用设置

    <hibernate-mapping>标签经常使用属性:


    <class>标签经常使用属性:


    <id>标签的经常使用属性:


    常见主键生成策略:



  • 相关阅读:
    Solon 特性简集,相较于 Springboot 有什么区别?
    Solon 1.2.12 发布,新的惊喜
    Springboot mini
    Springboot mini
    Springboot mini
    Springboot mini
    Springboot mini
    Springboot mini
    Springboot mini
    CODING 静态网站服务升级,快速、稳定、高拓展!
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7219162.html
Copyright © 2011-2022 走看看