Configuration
(1) AnnotationConfiguration
(2) 進行配置信息的管理
(3) 用來產生SessionFactory
(4) 可以在Configure方法中指定hibernate配置文件(不指定則默認爲
”hibernate.cfg.xml”)
(5) 只需關注一個方法即:buildSessionFactory()
注:不使用默認的hibernate.cfg.xml文件的情況
Teacher t = new Teacher();
t.setId(2);
t.setName("yilong");
t.setTitle("中級");
Configuration cfg = new AnnotationConfiguration();
SessionFactory sf =
cfg.configure(“hibernate.xml”).buildSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
session.close();
sf.close();
則程序會去找build path目錄下的”hibernate.xml”文件(放在src目錄下即可)。
面試 另外,還可以使用下面的方法創建一個Session。
Session session = sessionFactory.getCurrentSession();
表示如果當前上下文環境下沒有Session就自動創建一個,有就不用再創建,因此使用該方法創建的session在提交之前無論調用多少次getCurrentSession()方法得到的都是同一個Session(提交commit後再創建出來的就不一樣了);
上述的Session session = sf.openSession();方法表示直接創建一個新的Session,而不管是否已經存在,因此是比較久的一種創建Session的方法;
另外一個更加重要的區別是通過getCurrentSession創建的Session最後不需要調用session.close()方法(調用了反而會報錯),因爲在提交(commit)事務後會自動close。開發項目中openSession()方法往往不能實現將兩個session操作放在同一個事務裏,因此用getCurrentSession()能夠界定事務邊界。
上述提到的”上下文環境”是通過hibernate.cfg.xml配置文件設置的,表示的是從當前線程裏面找是否存在Session,具體配置語句如下:
<property name="current_session_context_class">thread</property>
裏面的參數往往設置爲jta或者thread(使用了getCurrentSession方法就必須將其設置爲thread,否則會報錯:org.hibernate.HibernateException: No CurrentSessionContext configured!)。
而使用thread則是調用基本的Connection方式管理事務:
Connection conn = DriverManager.getConnection(“……”);
conn.setAutoCommit(false);
……
conn.commit();
conn.setAutoCommit(true);
但是,有些情況只用一個Connection對象是管理不了事務的(例如:分佈在多臺不同數據庫的服務器上的事務的情況),這個時候就需要提供一個事務管理器(tomcat不行,藉助spring才行,JBOSS可以)。而jta(JAVA Transaction API)就是JAVA裏專門用於管理事務的API,因此jta可以解決上面的分佈式事務,但是由於tomcat不提供事務管理器的功能,因此不能設置爲jta。