gpt4 book ai didi

hibernate - Spring JPA 审计因多个数据源而失败

转载 作者:行者123 更新时间:2023-12-05 07:16:50 25 4
gpt4 key购买 nike

有很多网站解释如何set up Spring auditing .我不打算在这里重复所有这些。我的问题是,在让 Spring Auditing 工作了很长时间之后,我们有了一个新的要求。

我们现在必须添加第二个数据源以从不同的 Oracle 数据库读取数据。这似乎也能正常工作。但是,当我添加第二个数据源时,出乎意料的是,审计已停止工作。

错误是看似不言自明的:

Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "RESTENDPOI0_"."LASTCHANGEDDATE": invalid identifier

问题似乎是 LAST_CHANGED_DATE 现在缺少下划线。

使用 Spring Boot 2.1.3.RELEASE,当然不需要声明数据源(这是从 application.yml 中获取的)、entityManager 或事务管理器。

但是当添加第二个数据源时,除了 application.yml 中的新定义之外,我还必须声明两个新类。一个用于 PrimaryDataSource(如下所示),一个用于辅助数据源(未显示,这是一个只读数据源,审计不是它的故事的一部分)。

显而易见的答案是,有关手动定义这些 Bean 的某些事情破坏了 EventListener。但我无法将这种观察转化为任何类型的解决方案。

(显然)相关代码在这里:

审计模型

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AuditModel implements Serializable {

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "LAST_CHANGED_DATE", nullable = true)
@LastModifiedDate
private Timestamp lastChangedDate;
...

被审计实体

@Entity
@Table(name = "ENDPOINT")
public class Endpoint extends AuditModel {
private String endpointName;
private String httpVerb;

主要数据源

@Configuration
@EnableJpaAuditing
@EnableJpaRepositories(basePackageClasses={ xxx.scheduler.model.Endpoint.class, xxx.scheduler.repository.EndpointRepository.class} ,
entityManagerFactoryRef = "dashboardEntityManagerFactory",
transactionManagerRef = "dashboardTransactionManager")

public class PrimaryDataSource {

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

@Bean
@Primary
public LocalContainerEntityManagerFactoryBean dashboardEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dashboardDataSource());
emf.setPersistenceUnitName("schedulerPrimaryPU");
emf.setJpaDialect(new HibernateJpaDialect());
emf.setJpaVendorAdapter(jpaVendorAdapter());
emf.setPackagesToScan(new String[] { "xxx.dashboardscheduler.model" });
return emf;
}

@Bean
@Primary
public PlatformTransactionManager dashboardTransactionManager(){
JpaTransactionManager transactionManager
= new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
dashboardEntityManagerFactory().getObject() );
return transactionManager;
}

@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(Database.ORACLE);
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.Oracle10gDialect");
vendorAdapter.setShowSql(false);
return vendorAdapter;
}

最佳答案

我也遇到过类似的问题,和审计本身无关。不知何故,第二个数据源不采用字段命名约定,因此当它必须是 last_changed_date 时,系统将 lastChangedDate 映射到 LASTCHANGEDDATEdashboardEntityManagerFactory 中的这些属性解决了这个问题:

Map<String, Object> props = new HashMap<>();
props.put("hibername.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
props.put("hibername.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
emf.setJpaPropertyMap(props);

关于hibernate - Spring JPA 审计因多个数据源而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59057136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com