Java 创建连接/会话时Spring Boot Hibernate运行查询
我有一个Spring引导应用程序,实现了Java 创建连接/会话时Spring Boot Hibernate运行查询,java,spring,hibernate,spring-boot,Java,Spring,Hibernate,Spring Boot,我有一个Spring引导应用程序,实现了RESTControllers。在RESTController中,我指定了/clients/端点(PUT方法)来更新客户端资源 在我的数据库(PostgreSQL)中,我在client表上实现了几个触发器,以记录client\u history表的更改历史。问题是我需要将更改的作者(user\u id)插入到client\u history表中 这个问题()引导我在触发器函数中使用GUC。 选择当前设置('custom.application\u user
RESTController
s。在RESTController中,我指定了/clients/
端点(PUT
方法)来更新客户端资源
在我的数据库(PostgreSQL)中,我在client
表上实现了几个触发器,以记录client\u history
表的更改历史。问题是我需要将更改的作者(user\u id
)插入到client\u history
表中
这个问题()引导我在触发器函数中使用GUC。选择当前设置('custom.application\u user\u id'))
现在我需要执行sql查询set custom.application\u user\u id={user\u id}
在Hibernate打开新会话时设置用户id。我曾尝试使用Hibernate拦截器来实现这一点,但这个解决方案不起作用
有人能给我举个例子,在创建会话时如何订阅事件吗
另外,我还有一个愚蠢的问题:应用程序收到的每个HTTP请求是否都会创建(从连接池获取)新连接?经过研究,我发现了这个技巧。 对于我来说,我的项目中有两个数据源(ds1、ds2) 为了在ds1中创建连接/会话时运行查询,我在用@Configuration注释的类中执行了以下操作:
@Primary
@Bean
@ConfigurationProperties("spring.datasource.ds1")
public DataSourceProperties ds1DataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource.ds1.configuration")
public DataSource ds1DataSource() {
HikariDataSource hikariDataSource = ds1DataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
hikariDataSource.setConnectionInitSql("ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/YYYY' " +
"NLS_SORT='Binary' " +
"NLS_NUMERIC_CHARACTERS='.,' " +
"NLS_LANGUAGE='FRENCH'");
return hikariDataSource;
}
那么用例就是要有审计信息?如果是这样,也许您可以使用jpa审计、hibernate envers或类似工具。“应用程序收到的每个HTTP请求是否都创建(从连接池中获取)新连接?”每个事务都从池中获取连接,并在最后释放。@stripfire感谢您的回复。是的,这主要是为了审计。我更喜欢将此功能保留在数据库大小上,因为它减少了Hibernate往返。它还允许记录更改,以防有人试图直接更新数据库中的数据。
@Primary
@Bean
@ConfigurationProperties("spring.datasource.ds1")
public DataSourceProperties ds1DataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource.ds1.configuration")
public DataSource ds1DataSource() {
HikariDataSource hikariDataSource = ds1DataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
hikariDataSource.setConnectionInitSql("ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/YYYY' " +
"NLS_SORT='Binary' " +
"NLS_NUMERIC_CHARACTERS='.,' " +
"NLS_LANGUAGE='FRENCH'");
return hikariDataSource;
}