Spring JPA – Multiple Databases

zed(Rust)开源项目完整源码 「zed(Rust)开源项目完整源码」是开源项目(Rust)。项目简介:Code at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.源码完整,下载解压即可查看使用,适合学习参考、课程设计与二次开发。 立即下载

1. Overview

In this tutorial we’ll implement a simple Spring configuration for a Spring Data JPA system with multiple databases.

2. The Entities

First – let’s create two simple entities – each living in a separate database.

Here is the first entity “User“:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package org.baeldung.persistence.multiple.model.user;
 
@Entity
@Table (schema = "spring_jpa_user" )
public class User {
 
     @Id
     @GeneratedValue (strategy = GenerationType.AUTO)
     private int id;
 
     private String name;
 
     @Column (unique = true , nullable = false )
     private String email;
 
     private int age;
}

And the second entity – “Product“:

1
2
3
4
5
6
7
8
9
10
11
12
13
package org.baeldung.persistence.multiple.model.product;
 
@Entity
@Table (schema = "spring_jpa_product" )
public class Product {
 
     @Id
     private int id;
 
     private String name;
 
     private double price;
}

As you can see, the two entities are also placed in independent packages – this will be important as we move into the configuration.

3. The JPA Repositories

Next – let’s take a look at our two JPA repositories – UserRepository:

1
2
3
package org.baeldung.persistence.multiple.dao.user;
 
public interface UserRepository extends JpaRepository<User, Integer> { }

And ProductRepository:

1
2
3
package org.baeldung.persistence.multiple.dao.product;
 
public interface ProductRepository extends JpaRepository<Product, Integer> { }

Note, again how we created these two repositories in different packages.

4. Configure JPA with Java

Next – let’s get to the actual Spring configuration. We’ll start by setting up 2 configuration classes – one for the User and the other for the Product.

In each one of this configuration classes, we’ll need to define the following:

  • User DataSource
  • User EntityManagerFactory (userEntityManager)
  • User TransactionManager (userTransactionManager)

Let’s start by looking the the User configuration:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@Configuration
@PropertySource ({ "classpath:persistence-multiple-db.properties" })
@EnableJpaRepositories (
     basePackages = "org.baeldung.persistence.multiple.dao.user" ,
     entityManagerFactoryRef = "userEntityManager" ,
     transactionManagerRef = "userTransactionManager"
)
public class UserConfig {
     @Autowired
     private Environment env;
     
     @Bean
     @Primary
     public LocalContainerEntityManagerFactoryBean userEntityManager() {
         LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
         em.setDataSource(userDataSource());
         em.setPackagesToScan( new String[] { "org.baeldung.persistence.multiple.model.user" });
 
         HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
         em.setJpaVendorAdapter(vendorAdapter);
         HashMap<String, Object> properties = new HashMap<String, Object>();
         properties.put( "hibernate.hbm2ddl.auto" , env.getProperty( "hibernate.hbm2ddl.auto" ));
         properties.put( "hibernate.dialect" , env.getProperty( "hibernate.dialect" ));
         em.setJpaPropertyMap(properties);
 
         return em;
     }
 
     @Primary
     @Bean
     public DataSource userDataSource() {
         DriverManagerDataSource dataSource = new DriverManagerDataSource();
         dataSource.setDriverClassName(env.getProperty( "jdbc.driverClassName" ));
         dataSource.setUrl(env.getProperty( "user.jdbc.url" ));
         dataSource.setUsername(env.getProperty( "jdbc.user" ));
         dataSource.setPassword(env.getProperty( "jdbc.pass" ));
 
         return dataSource;
     }
 
     @Primary
     @Bean
     public PlatformTransactionManager userTransactionManager() {
         JpaTransactionManager transactionManager = new JpaTransactionManager();
         transactionManager.setEntityManagerFactory(userEntityManager().getObject());
         return transactionManager;
     }
}

Notice how we’re using the userTransactionManager as our Primary TransactionManager – by annotating the bean definition with @Primary. That’s helpful whenever we’re going to implicitly or explicitly inject the transaction manager without specifying which one by name.

Next, let’s discuss ProductConfig – where we define similar beans:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@Configuration
@PropertySource ({ "classpath:persistence-multiple-db.properties" })
@EnableJpaRepositories (
     basePackages = "org.baeldung.persistence.multiple.dao.product" ,
     entityManagerFactoryRef = "productEntityManager" ,
     transactionManagerRef = "productTransactionManager"
)
public class ProductConfig {
     @Autowired
     private Environment env;
 
     @Bean
     public LocalContainerEntityManagerFactoryBean productEntityManager() {
         LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
         em.setDataSource(productDataSource());
         em.setPackagesToScan( new String[] { "org.baeldung.persistence.multiple.model.product" });
 
         HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
         em.setJpaVendorAdapter(vendorAdapter);
         HashMap<String, Object> properties = new HashMap<String, Object>();
         properties.put( "hibernate.hbm2ddl.auto" , env.getProperty( "hibernate.hbm2ddl.auto" ));
         properties.put( "hibernate.dialect" , env.getProperty( "hibernate.dialect" ));
         em.setJpaPropertyMap(properties);
 
         return em;
     }
 
     @Bean
     public DataSource productDataSource() {
         DriverManagerDataSource dataSource = new DriverManagerDataSource();
         dataSource.setDriverClassName(env.getProperty( "jdbc.driverClassName" ));
         dataSource.setUrl(env.getProperty( "product.jdbc.url" ));
         dataSource.setUsername(env.getProperty( "jdbc.user" ));
         dataSource.setPassword(env.getProperty( "jdbc.pass" ));
 
         return dataSource;
     }
 
     @Bean
     public PlatformTransactionManager productTransactionManager() {
         JpaTransactionManager transactionManager = new JpaTransactionManager();
         transactionManager.setEntityManagerFactory(productEntityManager().getObject());
         return transactionManager;
     }
}

5. Simple Test

Finally – let’s test our configurations.

We will try a simple test by creating an instance of each entity and make sure it is created – as in the following example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@RunWith (SpringJUnit4ClassRunner. class )
@ContextConfiguration (classes = { UserConfig. class , ProductConfig. class })
@TransactionConfiguration
public class JPAMultipleDBTest {
     @Autowired
     private UserRepository userRepository;
 
     @Autowired
     private ProductRepository productRepository;
 
     @Test
     @Transactional ( "userTransactionManager" )
     public void whenCreatingUser_thenCreated() {
         User user = new User();
         user.setName( "John" );
         user.setEmail( "john@test.com" );
         user.setAge( 20 );
         user = userRepository.save(user);
 
         assertNotNull(userRepository.findOne(user.getId()));
     }
 
     @Test
     @Transactional ( "userTransactionManager" )
     public void whenCreatingUsersWithSameEmail_thenRollback() {
         User user1 = new User();
         user1.setName( "John" );
         user1.setEmail( "john@test.com" );
         user1.setAge( 20 );
         user1 = userRepository.save(user1);
         assertNotNull(userRepository.findOne(user1.getId()));
 
         User user2 = new User();
         user2.setName( "Tom" );
         user2.setEmail( "john@test.com" );
         user2.setAge( 10 );
         try {
             user2 = userRepository.save(user2);
         } catch (DataIntegrityViolationException e) {
         }
 
         assertNull(userRepository.findOne(user2.getId()));
     }
 
     @Test
     @Transactional ( "productTransactionManager" )
     public void whenCreatingProduct_thenCreated() {
         Product product = new Product();
         product.setName( "Book" );
         product.setId( 2 );
         product.setPrice( 20 );
         product = productRepository.save(product);
 
         assertNotNull(productRepository.findOne(product.getId()));
     }
}

6. Conclusion

This article was a practical overview of how to configure your Spring Data JPA project to use multiple databases.

The full implementation of this article can be found in the github project – this is an Eclipse based project, so it should be easy to import and run as it is.

IEC 63281-3-1:2024 电动运输车 - 第3-1部分:考虑实际使用温度条件的电动滑板车总运行时间性能测试方法 - 完整英文电子版(30页) IEC 63281-3-1:2024规定了电动滑板车单人运输总运行时间的测试方法,考虑了用户在不同温度下驾驶时的实际使用温度条件,用于公路或公共场所。 本文件不涵盖残障人士或老年人的电动滑板车。此外,本文件不包括货运电动滑板车。 立即下载

相关推荐

YOLO26算法表面凹坑与条纹检测+训练好的模型+610张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[未获取()] 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 100 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.7184** mAP50-95 | 0.4372 Precision | 0.6793 Recall | 0.7024 train/box_loss | 1.1399 train/cls_loss | 0.7578 val/box_loss | 1.3453 val/cls_loss | 1.0488 【训练过程分析】 记得从开始第一轮训练起,那曲线就一直像坐滑梯一样,很快地就下滑到了低谷值。大概到第 10 轮时,模型就开始缓慢而持续地从 0.5 左右的 mAP50 走向平稳上升的通道。整个训练过程,除了初期的那股势如破竹的气势外,中间部分的曲线就变得起伏不定,有时还会在某个阶段停滞不前,似乎在寻找下一个前进的方向。而到了后期,曲线又慢慢开始平稳下来,从第 80 轮开始,mAP50 的提升逐渐减缓,这时候,我不得不面对一个问题:是继续等待模型自行收敛,还是尝试更多的调参策略。在经过一轮轮的观察和思考后,我觉得继续等待已经不太可能有显著的进步,于是决定在第 95 轮时停下了脚步,最终完成了总共 100 轮的训练任务。 在训练过程的后半程,我注意到 loss 曲线虽然总体下降趋势明显,但在某些阶段却出现了停滞,特别是在第 70 轮到... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

SpringBoot 自动数据源配置分析

SpringBoot 自动数据源配置分析前言application.properties方式配置数据源数据源自动配置DataSourceBuilder 构建器 前言 通过分析源码来配置我们自己的数据源,不在百度复制粘贴。 说明:文章内的源码都是局部的。开发这东西需要动手操作。 application.properties方式配置数据源 这可能是初学者或第一次使用SpringBoot的最常见的方式了。 spring.datasource.username=root spring.datasource.pass

lkr_lkr的博客 1292

chromedriver-mac-arm64-159.0.8145.0(Canary).zip

chromedriver-mac-arm64-159.0.8145.0(Canary).zip

springboot2+JPA 配置多数据源(不同类型数据库)

springboot2+JPA配置多数据源(不同数据库)

qq_43082438的博客 7785

编程语言扩展与跨边界架构设计:五种组合方式、统一判定与框架开发(20章)

本资源是一份 20章系统化技术长文,围绕“宿主语言如何借外部力量获得自身不具备的能力”展开,建立 “脚本解释器核心—适配层—被组合组件”三层统一模型,系统拆解 进程级、函数级、协议级、语言级、数据级 五种边界,并给出可复用的 三问拆解法、跨边界四要素、适配层厚薄定律与横向判定规则。内容覆盖 Shell 管道、Python import、requests/psycopg2、setuptools entry_points、Make/CMake、CI/CD、Lua 嵌入式脚本、Airflow DAG 等八个典型实例,深入讲解进程通信、ABI/FFI、动态库加载、import 协议、插件发现与入口点、HTTP 与数据库线协议、序列化与 Schema、构建编排、任务调度与数据管道等机制。文档同时包含混合系统主导/从属方式判定、选型决策树、反模式批判、框架开发清单、插件 SDK 设计、隔离策略、性能预算、可观测治理、综合实例、术语表、原文核心内容收录与交付校验清单。本资源适合 架构师、框架/平台开发者、插件系统设计者、跨语言集成工程师、后端与数据平台工程师、技术负责人 阅读,可作为技术选型、架构评审、插件体系设计、跨边界排障与团队内训的参考手册。关键词: 编程语言扩展、跨边界架构、五种边界、三层模型、进程级组合、函数级组合、协议级组合、语言级组合、数据级组合、插件系统、FFI、ABI、import机制、HTTP、数据库线协议、CI/CD、Lua、Airflow、框架设计、技术选型。

植物大战僵尸神人版-手机版-arm64-2026.10.30-手机版.apk.1

植物大战僵尸神人版-手机版-arm64-2026.10.30-手机版.apk.1

springjpa的多数据源使用方法(with springboot)

本文主要阐述了springjpa 中如何使用操作多个数据源

菜鸟的学习笔记 466

不平衡电网下自抗扰顺序模型预测PWM整流器控制仿真模型(Simulink仿真实现)

不平衡电网下自抗扰顺序模型预测PWM整流器控制仿真模型(Simulink仿真实现)

关于Springboot-jpa多数据源的使用小结

关于Springboot配置多数据源分享和总结。

BAStriver的博客 673

双向储能变流器DCDC+并网PQ控制仿真(Simulink仿真实现)

内容概要:本文介绍了一种基于Simulink的双向储能变流器(DC-DC)与并网PQ控制的联合仿真模型,旨在实现储能系统在直流侧与交流侧的能量高效管理与协调控制。该仿真系统集成了双向DC-DC变换器的闭环控制策略与并网逆变器的PQ控制算法,能够精确模拟储能系统在不同工况下的充放电动态响应及并网运行特性。通过构建完整的系统架构,验证了控制策略在动态调节、功率解耦及系统稳定性方面的有效性,适用于微电网、可再生能源并网及储能系统参与电网辅助服务等应用场景的研究与开发。; 适合人群:具备电力电子、自动控制理论及新能源系统基础知识的高校研究生、科研人员以及从事储能系统、微电网或电力电子装置研发的工程技术人员。; 使用场景及目标:①研究双向储能变流器在直流微电网中的能量双向流动与电压稳定控制;②实现储能系统并网运行时的有功功率与无功功率独立调节(PQ控制);③验证DC-DC变换器与逆变器之间的协同控制策略在动态工况下的响应性能与稳定性;④为储能系统参与电网调频、调压及黑启动等辅助服务提供仿真验证平台。; 阅读建议:建议结合Simulink仿真模型与相关控制理论资料同步学习,重点关注控制器参数设计、系统动态响应分析及仿真结果的工程意义解读,有条件者可进一步进行硬件在环(HIL)实验验证,以提升对实际控制系统的理解与应用能力。

阻尼器磁流变阻尼器MR Damper非线性(阻尼、滞回)特性研究(Matlab代码实现)

内容概要:本文聚焦于磁流变阻尼器(MR Damper)的非线性动力学特性研究,重点探讨其在外部磁场调控下的阻尼力输出与典型滞回行为的建模与仿真。通过建立精确的数学模型描述其非线性、迟滞、饱和等复杂动态响应特征,并基于Matlab/Simulink平台实现完整的仿真系统,验证模型在不同激励条件下的有效性与鲁棒性。资源包含详细的建模过程、可运行的仿真代码及技术文档,支持用户进行二次开发与实验拓展,适用于深入理解智能材料器件的非线性机理及其在振动控制中的应用。; 适合人群:具备控制理论、机械动力学或智能材料基础知识,从事车辆工程、结构减振、半主动控制等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握磁流变阻尼器的非线性滞回特性及其物理建模方法;②熟练运用Matlab/Simulink进行复杂非线性系统的仿真分析;③支撑半主动悬架系统、建筑抗震装置等实际工程系统的控制器设计与性能优化;④服务于科研论文复现、课程项目设计及学位课题的技术实现。; 阅读建议:建议结合文档中提及的模糊PID控制、双闭环系统等相关仿真资源进行联动学习,重点关注模型参数辨识、仿真步长设置与结果收敛性分析,务必动手运行、调试代码并尝试引入不同输入信号以观察系统响应,从而深化对非线性动态行为的理解。

spring-data-jpa 中文文档(1)

spring-data-jpa 中文文档 简介 为了让Spring Data的版本保持一致,可以使用maven提供的dependencyManagement<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.data</groupId> <

怀揣梦想,永不止步. 9018

阻抗匹配详解

在深入理解阻抗匹配概念之前,我们可以先来一起看一个现象,首先使用一个信号发生器输出一个脉宽为 50ns 的单脉冲信号,同时将信号接入示波器,此时在示波器的波形视图上可以看到这个仅有一个脉冲的信号,如下图。如果我们将信号接入示波器的同时将电缆延长数米到外部,并且延长后电缆末端保持悬空不接入任何东西,引出一段未接入任何东西的开路电缆,按照常识应该没有任何影响,然而实测是在原有脉冲旁边多出了一个类似脉冲,如下图。

zhbi98 的技术 Blogs 2556

真正能跑起来的一对多关系:从设计契约到生产稳定

一对多关系是关系型数据库最基础也最易被误解的核心概念,其本质并非ER图上的连线,而是由主键、外键、索引与约束共同构成的数据完整性契约。它涉及结构一致性(字段类型/长度/NULL约束)、引用实时性(数据库级外键校验而非应用层模拟)、行为可预期性(CASCADE/RESTRICT等级联策略)。该契约直接决定查询性能(如联合索引优化ORDER BY)、数据可靠性(防孤儿记录)、业务演进弹性(支持软删除、多租户隔离、历史归档)。在电商、SaaS、IoT等高并发真实场景中,一个未对齐业务规则的外键设计,可能引发线上资

weixin_34226706的博客 793

硅纪元应用测评 | AI搜索引擎大比拼:360AI搜索、秘塔搜索、GenSpark AI和天工AI对比评测

搜索引擎输出的每个段落都有对应的出处,如果有错误,也是信息源的问题,从普通用户的角度来看,这与AI搜索的产品关系不大,能让用户对AI搜索的服务和得到的信息有一个隔离。同时,提供更多的定制选项,允许用户根据自己的偏好调整搜索结果的权重和排序,将使得搜索体验更加个性化和满足用户的具体需求。此外,大部分搜索工具还提供了一个无广告的搜索环境(360AI搜索部分内容会有广告),极大地提升了用户的搜索体验。AI搜索的本质依然是搜索,但它通过AI的逻辑分析和语言重新组织,使用户能够快速得到想要的信息。

guijiyuantech的博客 2013

智能体在车联网中的应用:第31天 基于RLlib的多智能体PPO实战:MAPPO算法解决simple_spread合作任务

本文介绍了如何利用RLlib框架实现多智能体强化学习算法MAPPO,解决simple_spread任务。首先分析了RLlib的架构设计理念和多智能体支持特性,包括策略映射、环境包装等核心组件。然后详细解析了simple_spread环境的任务定义、观察空间和奖励函数设计。最后回顾了MAPPO算法原理,说明其如何在RLlib中实现集中式训练与分布式执行的CTDE范式。文章提供了完整的安装指南和环境配置方法,帮助读者快速搭建多智能体强化学习实验环境。

IT深耕十余载,大道之简 1331

Spring JPA多数据源配置

Spring JPA多数据源配置 JamesGore119@gmail.com          在基于Spring+JPA(如hibernate)的应用当中,可能会遇到在同一ApplicationContext中集成多个数据源(多个持久化单元,多个事务管理器),每个数据源独立参与事务,非分布式事务,如应用系统集成不同的组件,不同组件使用不同的数据库系统,或不同组件需要分库存储。多数据源配置

JamesGore的专栏 5116

MS2107 CVBS转USB2.0 音视频采集芯片,支持1080P@30HZ输出

MS2107 是一款视频和音频采集芯片,支持CVBS转USB2.0 ;可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。

TEL18967112838的博客 2075

spring mvc 使用junit 测试 controller

spring mvc 使用junit 测试 controller

never give up的专栏 3303

南京银行信息技术岗提前批笔试与面试

1、笔试 笔试大致可以分为三部分:性格测试、行测题目、专业知识 性格测试 性格测试一般会有较多的体量,可能一共大概有一百多道接近两百道的样子,这个是不限时的。 前面有100道是这样的题目,就是有四个选项都是各种形容词,然后分别选出最符合自己的与最不符合自己的选项。这种题你就顺着自己的潜意识填就行了,但是前后要一致,我怀疑他出这么多题,可能就是考一考你记不记得前面填了啥。比如你做到第90题的时候,可能会出现和前面第2题类似的四个形容词,更有甚者就是一模一样的,你要对自己之前选的什么有个比较清楚的记忆。

qq_40971025的博客 6920

Python 爬虫实战:就业市场趋势数据抓取与行业洞察

在当今竞争激烈的就业市场中,了解行业趋势和就业形势对于求职者、学生以及人力资源专业人士来说至关重要。通过获取和分析就业市场数据,我们可以深入了解不同行业的招聘需求、薪资水平、技能要求等关键信息,从而为职业规划和人才发展提供有力支持。

yansideyucsdn的博客 1406

mysql 多数据库文件,mysqldump-将多个数据库从单独的mysql帐户转储到一个文件

The standard mysqldump command that I use ismysqldump --opt --databases $dbname --host=$dbhost --user=$dbuser --password=$dbpass | gzip > $filenameTo dump multiple databasesmysqldump --opt --databa...

weixin_28759987的博客 369

基于Simulink建模仿真的滑模控制的磁悬浮轴承稳定控制仿真

磁悬浮轴承(Magnetic Bearing)利用电磁力来支撑和定位转子,无需机械接触,因此在高速旋转设备中具有广泛应用。滑模控制(Sliding Mode Control, SMC)是一种鲁棒性强的非线性控制方法,适用于磁悬浮轴承的精确控制。以下是基于Simulink的磁悬浮轴承滑模控制系统的详细设计与仿真步骤。通过上述步骤,设计并实现了基于 Simulink 和 Control System Toolbox 的磁悬浮轴承滑模控制系统。

MHD0815的博客 778
上一篇: Spring-boot JDBC with multiple DataSources sample
下一篇: 设计无限级分类
daniel7443
博客等级 码龄24年 32粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值