08-session詳解
如何獲取session對象?
1,openSession
2,getCurrentSession
如果使用getCurrentSession需要在hibernate.cfg.xml文件中進行配置:
如果是本地事務(JDBC事務)
<property="hibernate.current_session_context_class">thread</property>
如果是全局事務(jta事務)
<property="hibernate.current_session_context_class">jta</property>
測試代碼:
importorg.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.junit.Test; public class SessionTest { @Testpublic void testOpenSession() { Configuration config=new Configuration().configure();//獲得配置對象 config.addClass(Students.class); //獲得服務註冊對象。 ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder() .applySettings(config.getProperties()).build();//通過config.getProperties()讀取配置文檔。 //創建會話工廠對象 SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); Session session=sessionFactory.openSession();//創建會話對象 if(session!=null) { System.out.println("session創建成功"); } else { System.out.println("創建失敗"); } } @Test public void testGetCurrentSession() { Configuration config=new Configuration().configure();//獲得配置對象 config.addClass(Students.class); //獲得服務註冊對象。 ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder() .applySettings(config.getProperties()).build(); //通過config.getProperties()讀取配置文檔。 //創建會話工廠對象 SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); Session session=sessionFactory.getCurrentSession();//創建會話對象 if(session!=null) { System.out.println("session創建成功"); } else { System.out.println("創建失敗"); } } }
運行後發現:一個運行成功,而另一個失敗,是因為沒有添加配置。
加上如下後,創建成功:
二者區別:
openSession與getCurrentSession區別
1,getCurrentSession在事務提交或者回滾後會自動關閉,而opensession需要手動關閉。如果使用openssesion而沒有手動關閉,
多次之後會導致連接池溢出。
2,openSession每次創建使用新的session對象,getcurrentSession使用現有的session對象(類似單例模式)。
驗證getCurrentSession每次重新創建對象:
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.junit.Test; public class SessionTest { @Test public void testOpenSession() { Configuration config=new Configuration().configure();//獲得配置對象 config.addClass(Students.class); //獲得服務註冊對象。 ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder() .applySettings(config.getProperties()).build(); //通過config.getProperties()讀取配置文檔。 //創建會話工廠對象 SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); Session session1=sessionFactory.openSession();//創建會話對象 Session session2=sessionFactory.openSession();//創建會話對象 System.out.println(session1==session2); /* if(session!=null) { System.out.println("session創建成功"); } else { System.out.println("創建失敗"); } */ } @Test public void testGetCurrentSession() { Configuration config=new Configuration().configure();//獲得配置對象 config.addClass(Students.class); //獲得服務註冊對象。 ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder() .applySettings(config.getProperties()).build(); //通過config.getProperties()讀取配置文檔。 //創建會話工廠對象 SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry); Session session1=sessionFactory.getCurrentSession();//創建會話對象 Session session2=sessionFactory.getCurrentSession();//創建會話對象 System.out.println(session1==session2); /* if(session!=null) { System.out.println("session創建成功"); } else { System.out.println("創建失敗"); } */ } }
結果:false true
hbm配置文件常用設置
<hibernate-mapping>
schema="schemaName" //模式名
catelog="catelogName" //可以設置目錄名稱
default-cascade="cascade_style" //級聯風格
default-access="filed|property|ClassName" //訪問策略
default-lazy="true|false" //加載策略
package="packagename"
/>
<class
name="ClassName" //對象關系映射的類
table="tableName" //類所映射數據庫中對應的表
batch-size="N" //抓取策略,每次抓取多少條數據
where="condition" //抓取數據的條件
entity-name="EntityName" //支持多個映射,同一個實體類可以映射成多個表
/>
<id //表示一個表的主鍵
name="propertyName" //主鍵要映射類的屬性
type="typename" //數據類型
column="column_name" //映射到數據庫中字段名
length="length" //指定長度
<generator class="generatorClass"/> //主鍵生成策略
</id>
主鍵生成策略
increment 自動遞增
identity 由底層數據庫生成
sequence 根據地底層數據庫的序列生成標識符,要求底層數據庫支持序列
hilo 分局high/low算法生成標識符
seqhilo 使用高/低算法的生成long,short或者int類型標識符
native 根據底層數據庫對標識符生成標識符方式,自動選擇identity,sequence或者hilo
uuid.hex 采用128為的uuid算法生成標識符
uuid.string uuid被編碼成一個16字符長的字符串
assigned 適用自然主鍵,由java程序負責生成標識符
foreign 使用另外一個相關聯對象的標識符。
08-session詳解