如何获取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("创建失败");
        }
    }
}



运行后发现:一个运行成功,而另一个失败,是因为没有添加配置。

session recording 服务器 绑定 证书 registration session_数据库

加上如下后,创建成功:

session recording 服务器 绑定 证书 registration session_hibernate_02

 

二者区别:

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