java - 如何在 Hibernate 中配置 StatementInspector?

标签 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 session 级别都设置它)。

最佳答案

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

这样,无论您是使用 JPA(例如 Spring Data JPA)还是 native Hibernate(例如带有 HibernateTranscationManagerLocalSessionFactoryBean 的 Spring)引导 Hibernate 都没有关系。

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

<property
    name="hibernate.session_factory.statement_inspector"
    value="com.vladmihalcea.book.hpjp.hibernate.logging.inspector.SqlCommentStatementInspector"
/>

或者,您也可以设置 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;
}

请注意 hibernate.session_factory.statement_inspector设置可以采用 String代表他完全合格的类(class)实现 StatementInspector界面,一个Class<? extends StatementInspector>StatementInspector对象引用。

关于java - 如何在 Hibernate 中配置 StatementInspector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39112308/

相关文章:

java - Primefaces fileDownload - 已经为此响应调用了 getOutputStream()

java - 使用 Apache HttpClient API 的 Wpad 文件进行代理设置

java - vector 卷积 - 计算相邻元素的索引

java - 如何将分页应用于带有连接的 SQL 查询的结果?

java - 玩框架路线

mysql - 我如何在mysql中编写一个触发器来在插入之前检查重复记录

php - 是否可以将数据传递给 Oracle 触发器?

java - 如何避免在 Hibernate 中获取 javassist 惰性实体代理实例

java - 在使用 JPA 在 Spring 中保持多对一关系的同时,它添加了额外的不必要的父实体

java - 如何在 Hibernate 中重用模型而不创建新模型