首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring/Hibernate下的多个会话工厂

问题: Spring / Hibernate 下的多个会话工厂是什么?

答案:

在 Spring 框架和 Hibernate 持久化层框架中,SessionFactory 是一个用于创建、获取、缓存和关闭 Hibernate Session 的核心 API。一个 @Configuration 类中通常需要多个 SessionFactory,以便在不同的环境中使用,例如生产环境、测试环境或开发环境。多个会话工厂(SessionFactories)可以帮助你更灵活地管理你的程序中的 Hibernate 事务。

下面是创建和使用多个会话工厂的步骤:

1.在你的 @Configuration 类中添加多个 SessionFactory,使用 packagesToScan 属性来指定在哪些包中找到对应的实体类,这样 Hibernate 就可以根据这些实体类动态地生成对应的 Session(会话):

代码语言:java
复制
@Configuration
@Profile("dev")
@EnableJpaRepositories("com.example.repositories")
public class HibernateConfig {
    
    @Autowired
    private Environment environment;
    
    @Autowired
    private DataSource dataSource;
    
    @Bean(name = "sessionFactoryA")
    public SessionFactory sessionFactoryA() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setPackagesToScan("com.example.model.entity"); // 指定实体类的包名
        return sessionFactory.getObject();
    }
    
    @Bean(name = "sessionFactoryB")
    public SessionFactory sessionFactoryB() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setPackagesToScan("com.example.other.model.entity"); // 指定实体类的其他包名
        return sessionFactory.getObject();
    }
}
  1. 在 Spring MVC 控制器中使用对应的 Hibernate Session 进行数据库操作时,可以使用 ServletContext 对象来加载你的 SessionFactory
代码语言:java
复制
@Autowired
private ServletContext servletContext;

@Autowired
private SessionFactory sessionFactoryA;

@Autowired
private SessionFactory sessionFactoryB;

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Currency.class, sessionFactoryA.getCurrentSession().getSqlFunction("toCurrency"));
    binder.registerCustomEditor(Date.class, sessionFactoryA.getCurrentSession().getSqlFunction("current date"));
    binder.registerCustomEditor(Date.class, sessionFactoryB.getCurrentSession().getSqlFunction("current date"));
}
  1. 最后,在多个会话工厂中管理多个事务,可以采用事务切面来覆盖全切。使用 @Transactional 注解可以轻松设置事务级配置,实现基于多个会话工厂来定义事务边界:
代码语言:java
复制
@Transactional("transactionManagerA")
public void doTransaction1(HttpServletRequest request) {
    // 事务 1 操作
}

@Transactional("transactionManagerB")
public void doTransaction2(HttpServletRequest request) {
    // 事务 2 操作
}

应用场景

  • 在 Spring MVC 控制器中,在访问不同的数据库表时,需要使用不同的数据库会话对象。这样可以确保每个请求使用的会话环境都是干净的和隔离的。

推荐腾讯云的相关产品:

  • 腾讯云数据库 SQL Server 版
  • 腾讯云数据库 PostgreSQL 版
  • 腾讯云 Redis
  • 腾讯云云数据库 Citus
  • 腾讯云 MongoDB

具体使用这些产品的方法和链接地址,请参考腾讯云官方文档。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Hibernate api 之常见的类(配置类,会话工厂类,会话类)

1.2:config.configure(“cn/config/hibernate.cfg.xml”);         加载指定路径下指定名称的主配置文件   1.3:config.buildSessionFactory...();          创建session的工厂对象 2: SessionFactory :session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)   2.1:sf.openSession...    e:删除的方法:session.delete(对象);删除必须给主键;       3.2:Hibernate最重要的对象:      只用使用hibernate与数据库操作,都用到这个对象...3.4:Transaction:hibernate事务对象; 使用Hibernate api 之常见的类(配置类,会话工厂类,会话类)案例:   《这里只是列举了Hibernate的三个常见类,其他配置文件和实体类之前的博客写过...三个常见类,配置类,会话工厂类,会话类,over!!!

1.2K50
  • Spring-SpringMVC-Hibernate在IntelliJ与Maven的环境下搭建

    JavaEE课程时,课程项目里使用的是比较“古老”的SSH(Struts2+Spring+Hibernate)框架,最近受某小朋友的影响着手了解SpringMVC,一种更轻量级,更方便使用的框架。...所以此次介绍的是另一种多框架的混合使用,即,Spring + SpringMVC + Hibernate框架在InteliJ和Maven的环境下的搭建,并采用注释的写法。...这样一来,对于UserServiceImpl这个类的实例,Spring给它起的名字就不是userServiceImpl了,而是userService,如果某个接口的实现类有多个,就可以使用这种方法来指定用哪个实现类...,个人认为,如果每个接口都只有一个实现类,那么这么做确实很方便,但如果有多个实现类并且可能会更换的话,就不如配置文件明了了。...-- session工厂 --> <!

    1.5K10

    加速你的Hibernate引擎(下)

    这种加载需要很多时间,既有网络带宽的原因,如果Hibernate的会话是有状态的,其中也会有会话缓存的原因(内存消耗和GC暂停)。...实际上最后两个调用序列在大多数场景下是个不错的替代方案,这要归功于它们的数据一致性保障。 如果你的数据读很多或者很少有并发缓存访问和更新,那么可以使用“nonstrict-read-write”策略。...Spring 2.5声明式事务的注解。...不幸的是Spring 2.5不支持Hibernate无状态会话,所以我们只能关闭二级缓存;设置fetch_size;用DML风格的更新来代替for循环,以此改善性能。 但是,执行时间还是要6分钟。...将Hibernate的日志级别调成trace后,我们发现是更新会话缓存造成了延时。通过在DML更新前清除会话缓存,我们将时间缩短到了4分钟,全部都是将数据加载到会话缓存中花费的时间。

    97130

    如何使用 Tmuxp 来优雅的管理多个 Tmux 会话

    使用 tmuxp 可以很好的帮助我们来管理 tmux 的会话(session),解决了平时在使用 tmux 工具时候的痛点。 1....工具介绍 安装和使用都非常简单 事实上,tmuxp 也是一个构建于 tmux 之上的对象关系映射的 ORM 的 API 工具,就是利用 tmux 工具定义的窗格(pane)、窗口(windows)和会话...简洁的语法 都支持在单独的命令中使用简短标记 加载会话 都是根据配置文件中加载 tmux 会话(session) 多种格式支持 可以使用 YAML, JSON 以及 dict 字配置项 # 只有这一种安装方式...当然我们也可以使用其提供的命令,进行会话的相关操作和使用。下来就让我们一起去看看,如何使用吧!.../mysession.yaml $ tmuxp load ~/workspaces/myproject.yaml # 通过自定义会话名称加载 $ tmuxp load mysession # 一次加载多个会话

    4.3K31

    MyEclipse6.5下struts2+spring2+hibernate3 整合

    下载地址:http://www.apache.org 3、spring2.5.5,最新版为2.5.6,下载地址为http://www.springsource.org/download 4、hibernate3.2...最新版为3.3.2,下载地址为https://www.hibernate.org 软件准备好了就可以开始搭建环境了,由于是新学习,因此没有使用myeclipse提供的自动引入spring和...1、在myeclipse6.5下新建一个web project项目 2、先来引入struts2的支持:把下载回来的struts2的压缩包解开,把解压目录下lib目录下的struts-core-2.0.11.2...3、引入spring2支持:把spring解压目录下dist下的spring.jar拷贝到WebRoot\WEB-INF\lib目录下 4、hibernate3支持:把hibernate解压目录下的hibernate3...5、一些基础支持的引入:如日志、数据库驱动(我用的是mysql数据库,所以引入的是mysql数据库支持包)、连接池、以及一些基础的公用的支持包,这些包都能在struts2、spring、hibernate

    16110

    【技术创作101训练营】聊聊MyBatis源码

    只要定义了POJO 到数据库表的映射关系,就可以通过Hibernate提供的方法完成数据库操作。 Hibernate符合JPA规范,就是Java持久层API。...Ibatis-Spring作为Spring框架和MyBatis框架的桥梁。...(第10页PPT): 那么这是我们想要的么?答案当然不是,有什么好的解决方案么? (第11页PPT): 我们经常在使用MyBatis的过程中,会配置下XML文件或者利用注解的方式配置下扫描的包。...没错,这就是SqlSessionFactoryBuilder会话工厂构建器读取的入参,通过字符流/字节流,然后如果配置了多数据源,构建出多个会话工厂,则可以根据每个会话工厂进行绑定数据源,执行过程中进行会话操作...互动环节 (第12、13页PPT): 没错,XXX同学回答的很好,我们可以看图系统中的操作,我们统一理解是操作了一次会话,会话调用MyBatis提供的SessionAPI的时候其实原理是通过动态代理方式将会话委托给

    89360

    Spring学习笔记 依赖注入

    因此这里用Gradle来说明一下Spring依赖注入的配置过程。Spring模块化做得非常好,如果我们想要使用某个功能,只需要导入对应的模块,也就是Jar包即可。...为了启用spring的单元测试支持,需要添加spring-test.jar和junit-4.12.jar。要运行最后面的Hibernate小例子,需要添加MySQL驱动和Hibernate核心包。...这时候需要额外指定一个属性factory-method指明要使用的静态工厂方法。...原型作用域会在每次请求Bean的时候创建一个新对象。这种作用域用来定义有状态的Bean,比如用户会话。每次请求用户会话,都会返回一个新的会话,每个用户的会话因此不同。...Autowired首先会按照类型进行查找,如果发现同类型的多个Bean,就会按照名称进行匹配。如果既没有同类型的Bean也没有相同名称的Bean,Spring就会抛出异常。

    32420

    Hibernate的二级缓存 下

    这说明HIbernate的缓存是跨session的 也就是一个session对象被干掉了以后,他的缓存还是存在的,不因session被干掉二干掉。...5name:  HOngten ID : 6name:  HOngten ID : 7name:  HOngten 第一条selelct语句是从数据库中读出数据然后将数据放入二级缓存中,接着进入第二个会话...Iterator会向二级缓存索要查询的数据,他的方式是首先将要查的实体类的主键值获取到, 这样在底层上就要使用一条selelct  id 的语句,就是我们看到的第二条selelct语句。...ID : 1name:  liuwei org.hibernate.impl.SessionFactoryImpl@19b46dc Hibernate的二级缓存是跟SessionFactory相关的,所以当一个...当然当这个SessionFactory对象关闭的时候,二级缓存中的数据也会消失。 因此,我们就会看到两个select语句。 所以:Hibernate的二级缓存又被叫做SessionFactory缓存

    35910

    面渣逆袭:二十二图、八千字、二十问,彻底搞定MyBatis!

    当然,万物皆可集成Spring,MyBatis通常也是和Spring集成使用,Spring可以帮助我们创建线程安全的、基于事务的 SqlSession 和映射器,并将它们直接注入到我们的 bean 中,...原理 15.能说说MyBatis的工作原理吗? 我们已经大概知道了MyBatis的工作流程,按工作原理,可以分为两大步:生成会话工厂、会话运行。...构建会话工厂 构造会话工厂也可以分为两步: 会话运行 会话运行是MyBatis最复杂的部分,它的运行离不开四大组件的配合: 整体上总结一下会话运行: PS:以上源码分析比较简单,在真正的源码大佬面前可能过不了关...构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。...创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。

    90030
    领券