如何通过使用 JPA + Hibernate 和 Spring-boot 在一个数据库中使用多个模式?

2024-02-26

我需要它来访问一个数据库(MySQL)中的 2 个不同模式。

我在这里写了两个配置类:

package twodb.webfi.config;
import java.util.Properties;
import javax.persistence.EntityManagerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;   
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver;
import org.springframework.orm.hibernate4.HibernateExceptionTranslator;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@ComponentScan
@EnableTransactionManagement
@EnableJpaRepositories(basePackages={"twodb.webfi","twodb.mc"},
entityManagerFactoryRef = "entityManagerFactory1", 
transactionManagerRef = "transactionManager1",
considerNestedRepositories = true)
public class FirstConfig {

@Autowired
private Environment env;

@Bean
public PlatformTransactionManager transactionManager1()
{
    EntityManagerFactory factory = entityManagerFactory1().getObject();
    return new JpaTransactionManager(factory);
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory1()
{
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(Boolean.TRUE);
    vendorAdapter.setShowSql(Boolean.TRUE);

    factory.setDataSource(dataSource1());
    factory.setJpaVendorAdapter(vendorAdapter);
    factory.setPackagesToScan(new String[] {"twodb.webfi.entities","twodb.mc.model"});
    Properties jpaProperties = new Properties();

    jpaProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.ddl-auto"));
    jpaProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
    jpaProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.showSql"));
    factory.setJpaProperties(jpaProperties);

    factory.afterPropertiesSet();
    factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
    return factory;
}

@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator()
{
    return new HibernateExceptionTranslator();
}


@Bean(destroyMethod = "close")
 public HikariDataSource dataSource1() {
    System.out.println("<--HikariDataSource1-->");
        HikariConfig dataSourceConfig = new HikariConfig();
        dataSourceConfig.setDriverClassName(env.getProperty("ui.db.driver"));
        dataSourceConfig.setJdbcUrl(env.getProperty("ui.db.url"));
        dataSourceConfig.setUsername(env.getProperty("ui.db.username"));
        dataSourceConfig.setPassword(env.getProperty("ui.db.password"));           

        dataSourceConfig.setMaximumPoolSize(env.getProperty("hikari.maximumPoolSize", Integer.class, new Integer(1)));
        dataSourceConfig.setMinimumIdle(env.getProperty("hikari.minimumIdle", Integer.class, new Integer(1)));
        dataSourceConfig.setIdleTimeout(env.getProperty("hikari.idleTimeout", Long.class, new Long(600000)));   // 10 min
        dataSourceConfig.setMaxLifetime(env.getProperty("hikari.maxLifetime", Long.class, new Long(1800000)));  // 30 min
        dataSourceConfig.setPoolName(env.getProperty("hikari.poolName", "upiCp"));

        return new HikariDataSource(dataSourceConfig);
    }

 }

这里的另一个配置类:

package twodb.webfi.config;
import java.util.Properties;
import javax.persistence.EntityManagerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver;
import org.springframework.orm.hibernate4.HibernateExceptionTranslator;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@ComponentScan
@EnableTransactionManagement
@EnableJpaRepositories(basePackages={"twodb.webfi","twodb.mc"},
entityManagerFactoryRef = "entityManagerFactory2", 
transactionManagerRef = "transactionManager2",
considerNestedRepositories = true)
public class SecondConfig {

@Autowired
private Environment env;    

@Bean
public PlatformTransactionManager transactionManager2()
{
    EntityManagerFactory factory = entityManagerFactory2().getObject();
    return new JpaTransactionManager(factory);
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory2()
{
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(Boolean.TRUE);
    vendorAdapter.setShowSql(Boolean.TRUE);

    factory.setDataSource(dataSource2());
    factory.setJpaVendorAdapter(vendorAdapter);
    factory.setPackagesToScan(new String[] {"twodb.webfi.entities","twodb.mc.model"});
    Properties jpaProperties = new Properties();

    jpaProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.ddl-auto"));
    jpaProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
    jpaProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.showSql"));
    factory.setJpaProperties(jpaProperties);

    factory.afterPropertiesSet();
    factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
    return factory;
}

@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator()
{
    return new HibernateExceptionTranslator();
}   

@Bean(destroyMethod = "close")
 public HikariDataSource dataSource2() {
    System.out.println("<--HikariDataSource2-->");
        HikariConfig dataSourceConfig = new HikariConfig();
        dataSourceConfig.setDriverClassName(env.getProperty("web.db.driver"));
        dataSourceConfig.setJdbcUrl(env.getProperty("web.db.url"));
        dataSourceConfig.setUsername(env.getProperty("web.db.username"));
        dataSourceConfig.setPassword(env.getProperty("web.db.password"));           

        dataSourceConfig.setMaximumPoolSize(env.getProperty("hikari.maximumPoolSize", Integer.class, new Integer(1)));
        dataSourceConfig.setMinimumIdle(env.getProperty("hikari.minimumIdle", Integer.class, new Integer(1)));
        dataSourceConfig.setIdleTimeout(env.getProperty("hikari.idleTimeout", Long.class, new Long(600000)));   // 10 min
        dataSourceConfig.setMaxLifetime(env.getProperty("hikari.maxLifetime", Long.class, new Long(1800000)));  // 30 min
        dataSourceConfig.setPoolName(env.getProperty("hikari.poolName", "upiCp"));

        return new HikariDataSource(dataSourceConfig);
    }

  }

在这里我遇到了异常

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webCommonDaoImpl': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available: expected single matching bean but found 2: entityManagerFactory1,entityManagerFactory

有人能指出如何通过使用 JPA + Hibernate 和 Spring-boot 来使用多个数据库的正确方向吗?

I am ui and webschema 在 mysql 中。两者是相同的数据库。


使用限定符和 bean 名称可以避免任何冲突。

我在我的应用程序 yaml 文件中创建了不同的数据源配置,如下所示

db-abc:
  datasource:
  url: ${ABC_DATABASE_URL}
  username: ${ABC_DATABASE_USERNAME}
  password: ${ABC_DATABASE_PASSWORD}
  driverClassName: org.postgresql.Driver
db-xyz:
  datasource:
  url: ${XYZ_DATABASE_URL}
  username: ${XYZ_DATABASE_USERNAME}
  password: ${XYZ_DATABASE_PASSWORD}
  driverClassName: org.postgresql.Driver
db-batch:
  datasource:
  url: ${DATABASE_URL}
  username: ${DATABASE_USERNAME}
  password: ${DATABASE_PASSWORD}
  driverClassName: org.postgresql.Driver

并创建了我的数据源配置,如下所示

@Configuration
public class DataSourceConfig {

private final Environment env;

@Autowired
public DataSourceConfig(Environment env) {
    this.env = env;
}

@Bean(name = "abcDataSource")
@ConfigurationProperties(prefix = "db-abc.datasource")
public DataSource abcDataSource() {
    return DataSourceBuilder
            .create()
            .url(env.getProperty("db-abc.datasource.url"))
            .driverClassName(env.getProperty("db-abc.datasource.driverClassName"))
            .username(env.getProperty("db-abc.datasource.username"))
            .password(env.getProperty("db-abc.datasource.password"))
            .build();
}

@Bean(name = "xyzDataSource")
@ConfigurationProperties(prefix = "db-xyz.datasource")
public DataSource xyzDataSource() {
    return DataSourceBuilder
            .create()
            .url(env.getProperty("db-xyz.datasource.url"))
            .driverClassName(env.getProperty("db-xyz.datasource.driverClassName"))
            .username(env.getProperty("db-xyz.datasource.username"))
            .password(env.getProperty("db-xyz.datasource.password"))
            .build();
}

@Primary
@Bean(name = "batchDataSource")
@ConfigurationProperties(prefix = "db-batch.datasource")
public DataSource batchDataSource() {
    return DataSourceBuilder
            .create()
            .url(env.getProperty("db-batch.datasource.url"))
            .driverClassName(env.getProperty("db-batch.datasource.driverClassName"))
            .username(env.getProperty("db-batch.datasource.username"))
            .password(env.getProperty("db-batch.datasource.password"))
            .build();
}
}

并使用相应的 bean 来做我想做的事情...使用限定符和 bean 名称将避免任何冲突。

对于单个数据库中的多个模式,您可以使用上面的相应模式

@Table(
    schema = "schema1", 
    name = "TBL_SCHEMA1_TABLE"
)
public class Schema1Entity implements Serializable {                                                                            @Entity
@Table(
    schema = "schema2", 
    name = "TBL_SCHEMA2_TABLE"
)
public class Schema2Entity implements Serializable {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过使用 JPA + Hibernate 和 Spring-boot 在一个数据库中使用多个模式? 的相关文章

随机推荐

  • System.BadImageFormatException:无法加载文件或程序集[重复]

    这个问题在这里已经有答案了 C Windows Microsoft NET Framework64 v4 0 30319 gt InstallUtil exe C PRODUKCIJA D ebug DynamicHtmlTool exe
  • 将 WasapiLoopbackCapture wav 音频流转换为 MP3 文件

    我能够在 WasapiLoopbackCapture naudio 的帮助下捕获由扬声器生成的系统音频 但问题是它捕获 wav 文件并且 wav 文件的大小非常大 几乎 10 到 15 MB 分钟 我必须捕获 2 3 小时的音频 这太长了
  • 我不应该将接口作为 const 传递吗?

    我最近 又 遇到了将接口传递为时的 Delphi 编译器代码生成错误const https stackoverflow com a 7640979 12597泄漏参考 如果您的方法被声明为传递接口变量 则会发生这种情况const e g p
  • 链接的属性 target="_newtab"

    什么是 newtab 中的目标属性值HTML a 标签 我找不到有关浏览器兼容性的信息 它适用于所有现代浏览器吗 如果在浏览器选项中用户设置为在新窗口而不是在新选项卡中打开链接 它将如何工作 这个值是否在任何地方描述过HTML标准 你确定
  • 使用 pyplot.imshow 时禁用 MatPlotLib 警告

    第一次来这里 当我使用时 我收到以下警告pyplot imshow功能 使用 RGB 数据将输入数据裁剪到 imshow 的有效范围 浮点数为 0 1 整数为 0 255 根据我的数据 我知道这是完全预期的行为 如何关闭此警告 我努力了 i
  • 在字符串列表中搜索字符串的有效方法?

    我有一个字符串列表 需要查找哪些字符串与给定的输入值匹配 对我来说 存储此字符串列表并能够搜索它的最有效方法 内存与执行速度 是什么 字符串列表的启动和加载并不重要 但搜索的响应时间很重要 我应该使用 List 或 HashSet 还是只是
  • 使用 python 启动通过 chcp 65001 预先激活的控制台窗口

    我使用 python 库将 Unicode 字符打印到 Windows 控制台 如果我调用库中打印出 Unicode 字符的函数 它将引发异常 charmap codec can t encode characters 这就是我试图解决该错
  • ModuleNotFoundError:没有名为“flask”的模块

    阅读完这篇文章的标题后 不要尝试先复制 因为这里的内容可能会以不同的方式被问到 顺便说一句 我对 python 很陌生 现在为了工作需要开始学习 这是我的依赖项 virtualenv version gt 15 0 2 pip versio
  • “Message”:“此请求的授权已被拒绝。” OWIN中间件

    我将基于令牌的身份验证添加到我的 OWIN 中间件中 并且可以生成令牌 但在使用具有授权属性的 API 调用的令牌时 我总是收到 此请求的授权已被拒绝 尽管没有 Authorize 属性 但它工作正常 这是我的startup cs 和控制器
  • iOS,通过代码锁定设备

    出于测试目的 制作本地通知的屏幕截图 我需要能够从代码 测试代码或应用程序代码 锁定设备 模拟器 我从这里查看了几个答案 GSEventLockDevice 但它们很旧并且不适合我 XCUIDevice 中有一个私有方法 因此您可以使用它锁
  • Three.js - 如何检查对象是否位于球体后面(不可见)

    我有一个球体 球体 表面有对象 引脚 并且带有 DOM 元素 标签 这些元素是从引脚位置到 2d 世界计算得出的 我的问题是 当图钉位于地球后面 通过鼠标拖动或动画 时 我需要隐藏 DOM 中的标签 以便在没有图钉的情况下文本标签不可见 我
  • Android 相机预览在切换相机时冻结?

    我正在为我的应用程序编写一个自定义相机 使用后置或前置摄像头打开活动时 它工作正常 但我真的很难在活动中切换摄像机 当我点击切换相机按钮时 预览冻结但什么也没发生 我已经尝试了与相机和预览相关的其他问题中建议的答案和提示 但没有任何效果 这
  • 如何覆盖jquery/javascript设置的css高度?

    我有这个 var setHeight this outerHeight returns e g 687 someElement css height setHeight px important I want to override thi
  • 使用 g++ 编译多线程代码(-Wl,--no-as-needed 不起作用)

    我的问题实际上是在这里描述的 使用g 编译多线程代码 https stackoverflow com questions 19463602 compiling multithread code with g 但是关于使用 Wl no as
  • 检查进程是否已加载

    有没有办法检查应用程序是否已完成加载 例如 如果我要使用Process newProcess Process Start C someFile xls 有没有IsLoaded or IsFinishedLoading或类似的东西 以便在应用
  • Python sys.argv 超出范围,不明白为什么

    我有一个脚本 我已经使用了一段时间来轻松地将文件上传到我的服务器 它已经工作了很长一段时间 但我无法让它在我的新台式计算机上工作 代码很简单 import os path import sys import os from ftplib i
  • 找到链表中循环的起始节点?

    如何在给定的链表中找到循环的起始节点 我们称其为循环点 到目前为止 我已经了解以下内容 使用慢 快指针 假设列表有一个非循环部分的大小k 缓慢移动 k 步 快速移动 2k 步 快的是 2k k k steps ahead of slow 慢
  • MediaPlayer 视频大小代号?

    我一直在使用 Codename 1 来开发 VideoCapture String file Capture captureVideo Media video MediaManager createMedia file true f add
  • Django/jQuery 级联选择框?

    我想构建一个国家 州选择器 首先 您选择一个国家 地区 该国家 地区的州 省 自治区 直辖市 自治区将显示在第二个选择框中 在 PHP 和 jQuery 中做到这一点相当容易 但我发现 Django 表单在这个意义上有点限制 我可以在页面加
  • 如何通过使用 JPA + Hibernate 和 Spring-boot 在一个数据库中使用多个模式?

    我需要它来访问一个数据库 MySQL 中的 2 个不同模式 我在这里写了两个配置类 package twodb webfi config import java util Properties import javax persistenc