Java 创建连接/会话时Spring Boot Hibernate运行查询

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

我有一个Spring引导应用程序,实现了
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;
}