我建立了一個小型 Spring Boot 專案,用于某些監控。它有各種端點來通過 web 服務呼叫接收資料,并且應該將它們存盤到兩個不同的資料庫中。
雖然主資料庫一切正常,但我無法將資料保存到輔助資料庫。讀取現有資料作業正常,但我無法保存任何內容。我總是遇到一個例外:
javax.persistence.TransactionRequiredException:沒有正在進行的事務
這是編碼:
與光、運動和溫度 ( LMT ) 相關的所有內容都在一個資料庫中。Power ( P ) 的資訊存盤在第二個資料庫中(我有問題)。
我的包設定如下:
- [Configuration]
- [Controller]
--- [Light]
--- [Motion]
--- [Temperature]
--- [Power]
- [Model]
--- [LMT-Models]
--- [P-Models]
- [Repository]
--- [lmt]
--- [PowerMonitoring]
在我的配置包中,我有兩個持久性類,一個用于 LMT,一個用于 Power,它們都處理各自存盤庫的資料庫連接。LMT 一是主要的,電源一是次要的(或者更確切地說是非主要的):
主要資料來源:
@Configuration
@EnableJpaRepositories(
basePackages = "com.delta.Monitoring.Repository.lmt",
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "lmtTransactionManager"
)
public class LmtPersistenceConfiguration {
@Bean( name = "lmtDataSourceProperties")
@ConfigurationProperties("spring.datasource")
@Primary
public DataSourceProperties lmtDataSourceProperties() {
return new DataSourceProperties();
}
@Bean( name = "lmtDataSource")
@ConfigurationProperties("spring.datasource.configuration")
@Primary
public DataSource lmtDataSource() {
return lmtDataSourceProperties().initializeDataSourceBuilder()
.type(BasicDataSource.class).build();
}
@Bean(name = "entityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(lmtDataSource())
.packages(new String[]{"com.delta.Monitoring.Model.lmt"})
.build();
}
@Bean (name = "lmtTransactionManager")
@Primary
public PlatformTransactionManager lmtTransactionManager(
final @Qualifier("entityManagerFactory") LocalContainerEntityManagerFactoryBean lmtEntityManagerFactory) {
return new JpaTransactionManager(lmtEntityManagerFactory.getObject());
}
}
次要資料源:
@Configuration
@EnableJpaRepositories(
basePackages = "com.delta.Monitoring.Repository.PowerMonitoring",
entityManagerFactoryRef = "entityManagerFactorySecondary",
transactionManagerRef = "powerTransactionManager"
)
public class PowerPersistenceConfiguration {
@Bean( name = "powerDataSourceProperties")
@ConfigurationProperties("spring.powerdatasource")
public DataSourceProperties powerDataSourceProperties() {
return new DataSourceProperties();
}
@Bean( name = "powerDataSource")
@ConfigurationProperties("spring.powerdatasource.configuration")
public DataSource powerDataSource() {
return powerDataSourceProperties().initializeDataSourceBuilder()
.type(BasicDataSource.class).build();
}
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(powerDataSource())
.packages(new String[]{"com.delta.Monitoring.Model.PowerMonitoring"})
.build();
}
@Bean( name = "powerTransactionManager")
public PlatformTransactionManager powerTransactionManager(
final @Qualifier("entityManagerFactory") LocalContainerEntityManagerFactoryBean powerEntityManagerFactory) {
return new JpaTransactionManager(powerEntityManagerFactory.getObject());
}
}
這就是其中一個 Power-Repositories 的樣子。由于我還沒有對它做任何花哨的事情,所以我只是擴展了 JpaRepository:
@Transactional("powerTransactionManager")
public interface PowerDaysRepository extends JpaRepository<PowerDay, PowerDayId> {
}
最后,控制器,我總是得到例外:
@RestController
@RequestMapping("power")
public class PowerController {
private static final Logger myLog = LogManager.getLogger(PowerController.class);
@Autowired
PowerDayDetailsRepository powerDayDetailsRepository;
@PostMapping("/powerdaydetails")
public boolean insertPowerDayDetails(@RequestBody List<PowerDayDetails> powerDayDetails){
myLog.info("POST /power/powerdaydetails");
powerDayDetailsRepository.deleteAll();
//List<PowerDayDetails> lines = powerDayDetailsRepository.saveAllAndFlush(powerDayDetails);
List<PowerDayDetails> lines = powerDayDetailsRepository.saveAll(powerDayDetails);
myLog.info("Update size: " lines.size());
myLog.info("Received data: " powerDayDetails.size());
return lines.size() == powerDayDetails.size();
}
}
當我呼叫 /powerdaydetails-endpoint 時,我想將相應的資料保存在資料庫中。先全部洗掉,然后保存新收到的資料。當我使用saveAll()方法時,我沒有收到例外,但也沒有任何內容存盤在資料庫中。這是日志:
2022-10-20 10:00:12.067 資訊 22842 --- [http-nio-8321-exec-88] cmHController.Power.PowerController : POST /power/powerdaydetails
2022-10-20 10:00:12.639 資訊 22842 --- [http-nio-8321-exec-88] cmHController.Power.PowerController:更新大小:582
2022-10-20 10:00:12.639 資訊 22842 --- [http-nio-8321-exec-88] cmHController.Power.PowerController:接收資料:582
當我使用saveAllAndFlush()方法時,會發生上述例外并且 - 不用說 - 也沒有任何內容存盤在資料庫中。
我已經閱讀了很多關于@Transactional 和@Modifying 主題的內容,但這也從未解決我的問題。主要資料源以及各自的存盤庫和控制器完美運行并直接保存所有資料。似乎我在第二個資料源上犯了一個錯誤,或者還沒有告訴 Spring 在哪里/如何找到這個事務。
uj5u.com熱心網友回復:
這很簡單,并且一直在我眼前:在輔助資料源配置中,我將物體管理器工廠 bean 命名為“entityManagerFactorySecondary”,但在事務管理器方法中,我只提到了“entityManagerFactory”。
這就是它們的樣子:
return builder
.dataSource(powerDataSource())
.packages(new String[]{"com.delta.Monitoring.Model.PowerMonitoring"})
.build();
}
@Bean( name = "powerTransactionManager")
public PlatformTransactionManager powerTransactionManager(
final @Qualifier("entityManagerFactorySecondary") LocalContainerEntityManagerFactoryBean powerEntityManagerFactory) {
return new JpaTransactionManager(powerEntityManagerFactory.getObject());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/521166.html
下一篇:創建沒有資料庫連接的JPA物體
