Java 如何在Hibernate中配置StatementInspector?
表示onPrepareStatement(字符串sql)已弃用。如果希望检查和更改SQL语句,请提供StatementInspectorJava 如何在Hibernate中配置StatementInspector?,java,sql,hibernate,jdbc,inspect,Java,Sql,Hibernate,Jdbc,Inspect,表示onPrepareStatement(字符串sql)已弃用。如果希望检查和更改SQL语句,请提供StatementInspector 但我不清楚如何在Hibernate中的应用程序级别配置StatementInspector(我不想在每个Hibernate会话级别都设置它)。为了让它正常工作,必须引导Hibernate。为此: 在主类中,找到EntityManagerFactory实例。它可能看起来像这样: public static final EntityManagerFactory E
但我不清楚如何在Hibernate中的应用程序级别配置StatementInspector(我不想在每个Hibernate会话级别都设置它)。为了让它正常工作,必须引导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");
}
public static final SessionFactory EMPFAC = sources.buildMetadata().getSessionFactoryBuilder().applyStatementInspector(new Inspector()).build();
为persistence.xml
中的每个属性添加一个servReg.applySetting()。然后,在其下方添加以下内容:
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;
}
}
最后,返回主应用程序类,在注册POJO的静态块下面添加以下内容:
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");
}
public static final SessionFactory EMPFAC = sources.buildMetadata().getSessionFactoryBuilder().applyStatementInspector(new Inspector()).build();
现在,您可以返回到persistence.xml
并删除那里的属性声明。如果还没有,还可以删除publicstaticfinalentitymanager
声明(已将其替换为SessionFactory)
编辑:您实际上可以删除persistence.xml
,并且您的应用程序仍然可以正常工作
一切就绪 不要那样做)
你只需要两件事:
将属性添加到persistence.xml:
property name=“hibernate.session\u factory.statement\u inspector”value=“完全限定类名”
通过实现接口org.hibernate.resource.jdbc.spi.StatementInspector来编写侦听器类
利润 注册语句检查器的最佳方法是使用configuration属性
这样,无论您是使用JPA(例如Spring数据JPA)引导Hibernate还是使用本机Hibernate(例如使用HibernateTransationManager
和LocalSessionFactoryBean
)引导Hibernate,都无关紧要
因此,您可以通过persistence.xml
JPA配置文件提供hibernate.session\u factory.statement\u inspector
:
<property
name="hibernate.session_factory.statement_inspector"
value="com.vladmihalcea.book.hpjp.hibernate.logging.inspector.SqlCommentStatementInspector"
/>
请注意,hibernate.session\u factory.statement\u inspector
设置可以采用String
表示实现StatementInspector
接口的完全限定类,也可以采用类这不是必需的,只需按照另一个答案中所示设置属性即可。