【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>标签的常用属性:


常见主键生成策略:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要下载和配置Hibernate5软件包,请按照以下步骤进行操作: 1. 首先,前往Hibernate官方网站(https://hibernate.org/orm/downloads/)并下载最新的Hibernate版本。 2. 解压下载的文件并将其放置在您想要安装Hibernate的目录中。 3. 在您的项目中添加Hibernate的依赖项。如果您使用Maven,则可以在pom.xml文件中添加以下依赖项: ``` <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.0.Final</version> </dependency> ``` 4. 配置Hibernate的数据库连接信息。您可以在hibernate.cfg.xml文件中指定数据库连接信息。以下是一个示例配置文件: ``` <?xml version='1.0' encoding='utf-8'?> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost/mydatabase</property> <property name="hibernate.connection.username">myuser</property> <property name="hibernate.connection.password">mypassword</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.hbm2ddl.auto">update</property> </session-factory> </hibernate-configuration> ``` 5. 在您的代码中使用Hibernate进行数据库操作。以下是一个示例代码: ``` SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); // Perform database operations here transaction.commit(); session.close(); ``` 这些是下载和配置Hibernate5软件包的基本步骤。您可以根据您的需求进行进一步配置和自定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值