【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>標籤的常用屬性:


常見主鍵生成策略:



發佈了80 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章