https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/Interceptor.html 说onPrepareStatement(String sql)是不推荐使用的。如果您希望检查和更改SQL语句,请提供StatementInspector。
但我不清楚如何在应用程序级别在Hibernate中配置StatementInspector(我不想在每个休眠会话级别设置它)。
答案 0 :(得分:2)
不要那样做)
你只需要两件事:
property name =“hibernate.session_factory.statement_inspector”value =“完全合格的班级名称”
利润!
答案 1 :(得分:2)
正如我在this article中解释的那样,注册StatementInspector
的最佳方法是使用hibernate.session_factory.statement_inspector
配置属性。
通过这种方式,使用JPA(例如Spring Data JPA)引导Hibernate还是使用本机Hibernate(例如带有HibernateTranscationManager
和LocalSessionFactoryBean
的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
,您的应用程序仍然可以正常工作。
全部设定!