如何在 Hibernate 中配置 StatementInspector?

gos*_*in1 3 java sql hibernate jdbc inspect

https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/Interceptor.html 表示 onPrepareStatement(String sql) 已弃用。如果您希望检查和更改 SQL 语句,请改为提供 StatementInspector。

但我不清楚如何在应用程序级别的 Hibernate 中配置 StatementInspector (我不想在每个 Hibernate 会话级别设置它)。

Vla*_*cea 8

注册 a 的最佳方法StatementInspector是使用hibernate.session_factory.statement_inspector配置属性。

HibernateTranscationManager这样,无论您是使用 JPA(例如 Spring Data JPA)还是本机 Hibernate(例如带有和 的Spring LocalSessionFactoryBean)引导 Hibernate 都无关紧要。

hibernate.session_factory.statement_inspector因此,您可以通过JPA 配置文件提供persistence.xml

<property
    name="hibernate.session_factory.statement_inspector"
    value="com.vladmihalcea.book.hpjp.hibernate.logging.inspector.SqlCommentStatementInspector"
/>
Run Code Online (Sandbox Code Playgroud)

或者,hibernate.session_factory.statement_inspector如果您使用 Spring,您也可以以编程方式设置:

@Bean
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan({
        "com.vladmihalcea.books.high.performance.java.persistence"
    });
    sessionFactory.setHibernateProperties(hibernateProperties());

    return sessionFactory;
}

@Bean
public PlatformTransactionManager hibernateTransactionManager() {
    HibernateTransactionManager transactionManager
      = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory().getObject());
    return transactionManager;
}

private final Properties hibernateProperties() {
    Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty(
      "hibernate.session_factory.statement_inspector", 
      SqlCommentStatementInspector.class
    );
    hibernateProperties.setProperty(
      "hibernate.dialect", 
      "org.hibernate.dialect.H2Dialect"
    );

    return hibernateProperties;
}
Run Code Online (Sandbox Code Playgroud)

请注意,该hibernate.session_factory.statement_inspector设置可以采用String表示实现接口的完全限定类StatementInspectorClass<? extends StatementInspector>StatementInspector对象引用。


Paw*_*ski 5

HibernatePropertiesCustomizer您可以在春季使用

@Configuration
public class HibernateConfig {

    @Bean
    public HibernatePropertiesCustomizer configureStatementInspector() {
        return (properties) -> properties.put(AvailableSettings.STATEMENT_INSPECTOR, (StatementInspector) sql -> {
            // figure out what to return
            return sql;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)