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 使用另外一个相关联对象的标识符。
最新文章
- System Sounds: Alerts and Sound Effects
- matlab实现分水岭算法处理图像分割
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- html5中manifest特性测试
- net IL的一些探索
- Java中反射的三种常用方式
- HDU1312——Red and Black(DFS)
- maven 下载 源码和javadoc命令
- ibatis使用--SqlMapClient对象
- 关于用Java写的贪吃蛇游戏的一些感想
- 使用异步HTTP提升客户端性能(HttpAsyncClient)
- 机器学习基石:13 Hazard of Overfitting
- 前端技术之_CSS详解第四天
- python学习小总结(列表、元组、字典、集合、字符串)
- VirtualBox安装Archlinux并配置桌面环境
- 【JAVA】ThreadLocal源码分析
- javascript中获取元素尺寸
- [转载]表单校验之datatype
- 修改maven项目的编译版本
- [转]Magento刷新索引的几种方法
热门文章
- 服务器Tomcat WAS JBoss
- springmvc poi实现报表导出
- 2016.4.3NOI上较难的动规题目(仔细分析样例)--王老师讲课整理
- [标准性文档]WEB应用安全验证标准
- NHibernate官方文档中文版--基础ORM(Basic O/R Mapping)
- SQLAlchemy中filter()和filter_by()的区别
- (转载)如何学好iphone游戏开发
- [转]自用类库整理之SqlHelper和MySqlHelper
- [转]Oracle connection strings
- Kali之Metasploit Framework环境配置