Hibernate学习之SessionFactory

Stella981
• 阅读 588

由于SessionFactory是一个重量级的类,在一个应用中我们需要做成单例的,我选择的做法是: `

            import org.hibernate.SessionFactory;
            import org.hibernate.cfg.Configuration;             
            final public class Utils {
            
                private static SessionFactory  sessionFactory=null;                  
                static{
                    //创建SessionFactory会话工厂
                    sessionFactory=new Configuration().configure().buildSessionFactory();
                }                   
                private Utils(){                       
                }

                public static SessionFactory geSessionFactory(){
                    return sessionFactory;
                }
            }
            `

这样就可以在需要的地方直接调用

      SessionFactory factory=Utils.geSessionFactory();

        Session  s1=factory.openSession();
        Session  s3=factory.getCurrentSession();

openSession()是打开一个Session,因此每次得到的Session都不一样

getCurrentSession()是得到当前线程的一个Session,在一个thread中使用该方法得到的Session都是同一个Session 但是在使用getCurrentSession()前需要在hibernate.cfg.xml中做如下配置:

                <!-- java程序  -->
        <property name="current_session_context_class">thread</property>
                <!--  web程序 -->
        <property name="current_session_context_class">jta</property>

否则会报如下错误: No CurrentSessionContext configured!
在使用getCurrentSession()得到的session做查询操作(load())时需要使用事务,否则 会报如下错误:

      Exception in thread "main" org.hibernate.HibernateException: load is not valid without active transaction

而且这个session是自动关闭的

        使用load()查询时,如果查询不到,则会返回null,   load()使用一种代理机制,如果不使用查询得到的对象,则不会执行SQL语句,只有使用对象时才会执行SQL语句  【懒加载】

        get()查询,如果查询不到,则会抛出异常,且在查询时就执行SQL语句,不管查询的结果会不会使用
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
kenx kenx
3年前
个人博客开发之blog-api项目统一结果集api封装
前言由于返回jsonapi格式接口,所以我们需要通过javabean封装一个统一数据返回格式,便于和前端约定交互,状态码枚举ResultCodejavapackagecn.soboys.core.ret;importlombok.Getter;/@authorkenx@version1.0@date2021/6/1715:35
Souleigh ✨ Souleigh ✨
3年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Stella981 Stella981
3年前
Hibernate 在多线程下 获取唯一的SessionFactory
Hibernate在多线程下获取唯一的SessionFactory背景:在项目中使用了Hibernate,连接池用的是c3p0,最小连接数设置为5,问题来了,每当登录系统后,在数据库中查看连接数就会发现有10个session连接,这让我很是苦恼,经过debug发现在开始登录的时候,页面会同时发出两个ajax请求,
Stella981 Stella981
3年前
Hibernate:sessionFactory 对象的创建
packagecom.bjsxt.util;importorg.hibernate.SessionFactory;importorg.hibernate.cfg.Configuration;publicclassHibernateUtil{privatestatic
Stella981 Stella981
3年前
Hibernate对象
1)SessionFactory这是Hibernate的关键对象,它是单个数据库映射关系经过编译后的内存镜像,它也是线程安全的。它是生成Session的工厂,本身需要依赖于ConnectionProvider,该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。2)Session它是应用程序和持久层之间交互操作的一个单
Wesley13 Wesley13
3年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Stella981 Stella981
3年前
Hibernate 中Datetime类型属性数据库默认值
在有些时间,我们在设置Hibernate的配置文件时希望POCO类的一个属性使用数据库中的默认值,这种情况出现在应用服务器和数据服务器分开设置的系统中,或者是有多个反向代理的Cache服务器中,如何设置才能让Hibernate依照我们的要求工作呢?以下以MSSql为例说明一下:我们只需在配置文件中设置属性为如下格式就行了:<property