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>

测试代码:

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  使用另外一个相关联对象的标识符。

原文地址:https://www.cnblogs.com/alsf/p/7820418.html