hibernate5的初體驗

一個框架的學習不到第二遍我是不敢寫文章的,我總是跟着不同的視頻做不同的學習,我個人認爲這樣可以更好的鞏固知識點。已經是hibernate學習的二週目了,所以有了新的感悟,也有了新的問題要和大家分享。目前2017/06/04的hibernate版本是5.2.10,我當前使用的版本是5.2.8。現在主流的教程使用的版本都是4.x.x的版本╮(╯▽╰)╭。

昨天覆習了MyBatis的知識,寫了幾篇文章,今日再來看hibernate,感受到的是兩個ORM框架在設計思維和目的上的不同。但是更多的是真的感受到了智慧的火花。好了,廢話不多說,開始體驗一把hibernate。

既然是對象到關係的映射,我們需要先有一個對象。

public class News {
	private int id;
	private String title;
	private String author;
	private Date date;
	
	public  News() {
	}

	public News(String title, String author, Date date) {
		this.title = title;
		this.author = author;
		this.date = date;
	}
	// 省略了set/get/toString方法
}

 

 

 

好了,到目前爲止,接觸了那麼多的框架,如果要想讓框架融入我們的項目,總是需要一個核心配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">123456</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate1</property>
        <property name="hibernate.connection.username">root</property>
        <!-- 配置數據庫方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    	<!-- 是否在控制檯打印SQL語句 -->
    	<property name="show_sql">true</property>
    	<!-- 打印的SQL語句是否需要格式化 -->
    	<property name="format_sql">true</property>
    	<!-- 可以幫助java代碼生成數據庫腳本,進而生成具體的表結構 -->
    	<property name="hbm2ddl.auto">update</property>
    	<mapping resource="edu/ctgu/hibernate/news/News.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

 

 

 

下面的工作就是將Java對象映射到數據庫關係(數據表),所以需要一個映射文件。這點和MyBatis有點不同,因爲在hibernate中完全不需要SQL語句的構建,框架自動就做了,開發者完全面向對象操作即可。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="edu.ctgu.hibernate.news.News" table="NEWS">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="title" type="java.lang.String">
            <column name="TITLE" />
        </property>
        <property name="author" type="java.lang.String">
            <column name="AUTHOR" />
        </property>
        <property name="date" type="java.sql.Date">
            <column name="DATE" />
        </property>
    </class>
</hibernate-mapping>

 

 

 

好了,配置工作基本完成,單元測試可以做了。

public class NewsTest {
	private SessionFactory factory = null;
	private Session session = null;
	private Transaction transaction = null;
	@Before
	public void testBefore(){
		// 1.初始化配置文件加載配置信息,默認加載src目錄下的hibernate.cfg.xml文件
		Configuration configuration = new Configuration().configure();
		// 3.初始化SessionFactory,別忘了之前重要的註冊
		factory = configuration.buildSessionFactory();
		// 4.打開Session
		session = factory.openSession();
		// 5.開啓事務
		transaction = session.beginTransaction();
	}
	
	@After
	public void testAfter(){
		transaction.commit();
		session.close();
		factory.close();
	}
	
	@Test
	public void test(){
		News news = new News("今日頭條", "雷軍", new Date(new java.util.Date().getTime()));
		session.save(news);
	}
}

 

 

 

這裏有一個不得不提出的問題,一個折騰了我兩個小時的問題。在hibernate更新到版本4的時候,出現了一個新特性,需要註冊配置和服務,所以4.x.x是這樣得到SessionFactory的:

Configuration config = new Configuration().configure("abc.xml");
ServiceRegistry seRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
SessionFactory sf = config.buildSessionFactory(seRegistry);

 

 

 

但是版本5不支持這樣創建了啊,但是可以支持這樣寫:

// 1.初始化配置文件加載配置信息,默認加載src目錄下的hibernate.cfg.xml文件
Configuration configuration = new Configuration().configure();
// 2.將配置信息註冊到服務中
ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
// 3.初始化SessionFactory,別忘了之前重要的註冊
SessionFactory factory = configuration.buildSessionFactory(registry);

 

預編譯不會報錯,語法語義都沒問題,但是一跑起來就會出現UnKnown Entity的異常,簡直氣死人。

終於,我看到了一個大牛的博客,人家也有這樣的困擾,訪問了老外的網站(其實我完全可以先去看看hibernate的官方demo,奈何吃了英語的虧╮(╯▽╰)╭)。然後給出了兩種方法,比較穩定的一種就是我當前使用的。我不知道hibernate3是不是就是這樣寫的,因爲註冊配置和服務是版本4新增的。唉,這些都無從考證了,只是希望新入坑的朋友少吃虧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章