1. 程式人生 > >08-session詳解

08-session詳解

數據類型 unit http enc cfg.xml apply imp nss long

如何獲取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>

測試代碼:

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 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詳解