我如何在Hibernate中配置StatementInspector?

时间:2016-08-23 23:40:57

标签: hibernate inspect

https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/Interceptor.html  说onPrepareStatement(String sql)是不推荐使用的。如果您希望检查和更改SQL语句,请提供StatementInspector。

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

3 个答案:

答案 0 :(得分:2)

不要那样做)

你只需要两件事:

  1. 将属性添加到persistence.xml:
  2. property name =“hibernate.session_factory.statement_inspector”value =“完全合格的班级名称”

    1. 通过实现接口org.hibernate.resource.jdbc.spi.StatementInspector来编写监听器类。
    2. 利润!

答案 1 :(得分:2)

正如我在this article中解释的那样,注册StatementInspector的最佳方法是使用hibernate.session_factory.statement_inspector配置属性。

通过这种方式,使用JPA(例如Spring Data JPA)引导Hibernate还是使用本机Hibernate(例如带有HibernateTranscationManagerLocalSessionFactoryBean的Spring)都没有关系。

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

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

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

@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来表示他实现StatementInspector接口的完全合格的类,或者是Class<? extends StatementInspector>StatementInspector对象参考。

答案 2 :(得分:0)

为了使其工作,你必须引导Hibernate。要做到这一点:

在您的主类中,找到您的EntityManagerFactory实例。它可能看起来像这样:

public static final EntityManagerFactory EMPFAC = Persistence.createEntityManagerFactory("jpa")

暂时离开该行。在它上面,添加以下内容:

private static StandardServiceRegistryBuilder servReg = new StandardServiceRegistryBuilder();
static {
    //Do this for every property in persistence.xml
    servReg.applySetting("hibernate.connection.url", "jdbc://myurl://www.example.org");
}

servReg.applySetting()中的每个媒体资源添加persistence.xml。然后,在它下面添加:

private static MetadataSources sources = new MetadataSources(servReg.build());
static {
    // Do this for every pojo with JPA annotations
    sources.addAnnotatedClass(Pojo.class);
}

为应用程序中的每个JPA注释的pojo添加sources.addAnnotatedClass()。几乎在这里完成。现在创建一个实现StatementInspector的类,如下所示:

public class Inspector implements StatementInspector {

    private static final long serialVersionUID = 5545844969759630544L;

   @Override
   public String inspect(String select) {
       // modify string here
       return select;
   }
}

最后,返回主应用程序类,并在注册pojos的静态块下面添加以下内容:

public static final SessionFactory EMPFAC = sources.buildMetadata().getSessionFactoryBuilder().applyStatementInspector(new Inspector()).build();

现在您可以返回persistence.xml并删除那里的属性声明。如果您还没有,也请删除public static final EntityManager声明(您已将其替换为SessionFactory)。

编辑:您实际上可以删除persistence.xml,您的应用程序仍然可以正常工作。

全部设定!