当前位置: 首页 > 知识库问答 >
问题:

LazyInitializationException使用多个数据源

乐正穆冉
2023-03-14

当我试图在spring-boot上使用多个数据源时,我面临着一个巨大的问题。我的问题是因为我正在使用spring batch,而我没有足够的权限在我的生产数据库上从spring-batch创建元数据表,所以我需要使用例如H2来创建这些表,但是当我试图在我的模型中加载一个在我的作业处理器中具有关系为@OneToMany的字段时,我收到了LazyInitializationException

Spring引导版本2.3.4 .发布

 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
 private List<Conta> accounts = new ArrayList<>();

我的处理器

   @Slf4j
    public class AccountItemProcessor implements ItemProcessor<AccountMaster, List<AccountBatch>> {
    @Autowired
    private ContaBatchConfigProperties contaBatchConfigProperties;

    @Override
    public List<AccountBatch> process(AccountMaster accountMaster) throws Exception {
        List<AccountBatch> accountBatchList = new ArrayList<>();
        for (Accounts obj: accountMaster.getAccounts()) {
            accountBatchList.add(ContaBatch.of(obj, contaBatchConfigProperties));
            accountBatchList.add(ContaBatch.of(accountMaster, contaBatchConfigProperties, obj));
        }
        return accountBatchList;
    }
 }

错误:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.example.AccountMaster.accounts, could not initialize proxy - no Session

我创建了批处理数据源作为主数据源

@Bean(name="batchDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.batch.datasource")
public DataSource batchDataSource(){
    return DataSourceBuilder.create().build();
}

共有1个答案

贺季同
2023-03-14

当您在事务之外使用< code>@OneToMany操作字段时,会发生惰性初始化。

开始一个交易你会有不同的方法

  1. 在服务方法的公共方法上使用@Transactional(针对您的案例的流程)
  2. 使用TransactionTemplate打开交易

当您在单数据源项目中时,这应该足够了,但在多数据源中,您必须小心数据来自哪个数据源。在此基础上,您必须使用相应的transsactionManager。

为此,您可以在@Transactional注释中添加属性transactionManager=myTransactionManagerForDatasourceA

如果您没有(或者不知道它的名称)事务管理器,您将必须定义它

如果您不想在所有@事务性注释中使用transactionManager值,因为在99%的情况下,您将使用相同的数据源,您可以使用@Primary注释您的数据源bean方法。默认情况下,@Transactional将使用主transactionManager,如果必须,可以使用transactionManager注释值来使用其他TransactionNavisphere

 类似资料:
  • 问题内容: 有人知道如何在hibernate配置中添加另一个数据源,以及如何在自己的DAO中将Spring配置为其自动注入该数据源吗? 这是我的带有一个数据源的代码,可以完美运行,但是我不知道如何添加另一个数据源。我想添加另一个数据源,该数据源是具有与实际数据库不同的表的数据库。 DAO EXAMPLE 问题答案: 我假定你有一组应使用的DAO的和适当的,而其他人应该使用不同的和基于。当然,你需要

  • 问题内容: database.php : 问题是我只能在配置中定义one ,default或stats。我遵循了CodeIgniter文档,并添加了以下内容: 这样,我连接到第二个数据库,但是失去了与第一个数据库的连接。有谁对如何加载两个数据库有任何想法,而不必在所有模型构造函数中执行以下操作? 问候, 佩德罗 问题答案: 除了应用Camacho提到的hack之外,您还可以将database.ph

  • 问题内容: 我有2个模型。 用户: 汽车: 贴图: 用户: 汽车: HomePageController: 但是当我执行line时: 以下堆栈跟踪出现错误: 我是否构造了错误的映射文件,尤其是多对多关系? 问题答案: 默认情况下,Hibernate将延迟加载集合。换句话说,除非绝对需要,否则它不会进入数据库来检索汽车列表。这意味着从您的dao层返回的对象将不会初始化汽车列表,除非您尝试访问它。当您

  • 我正试图使用INFOQ提供的本教程设置一个包含多个数据源的Springboot(v2.0.0.BUILD-SNAPSHOT)项目 https://www.infoq.com/articles/Multiple-Databases-with-Spring-Boot 但是我需要使用多个EntityManager来代替JdbcTemplate 这是我目前掌握的情况 应用属性 一个pplication.j

  • 一些代码: 这里,我从kinesis流中获取数据,并将其序列化到我的数据类中。一切正常,但现在需要增加以另一种格式接收数据的能力(例如,DataClassSecond) 其中一个选项是,添加一个额外的数据源并在您自己的流中处理它们。 但是这需要一个额外的运动队列。我不确定这是否是一个好方法有没有什么方法可以从运动接收不同的数据,然后根据类型分割流?