首页
学习
活动
专区
工具
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.1K50

Spring-SpringMVC-Hibernate在IntelliJ与Maven环境搭建

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

1.4K10

加速你Hibernate引擎(

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

94330

如何使用 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.1K31

MyEclipse6.5struts2+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解压目录下distspring.jar拷贝到WebRoot\WEB-INF\lib目录下 4、hibernate3支持:把hibernate解压目录下hibernate3...5、一些基础支持引入:如日志、数据库驱动(我用是mysql数据库,所以引入是mysql数据库支持包)、连接池、以及一些基础公用支持包,这些包都能在struts2、springhibernate

13910

【技术创作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时候其实原理是通过动态代理方式将会话委托给

84360

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就会抛出异常。

29520

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缓存

34110

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

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

74930
领券