Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate中配置StatementInspector?_Java_Sql_Hibernate_Jdbc_Inspect - Fatal编程技术网

Java 如何在Hibernate中配置StatementInspector?

Java 如何在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

表示onPrepareStatement(字符串sql)已弃用。如果希望检查和更改SQL语句,请提供StatementInspector


但我不清楚如何在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
    接口的完全限定类,也可以采用
    类这不是必需的,只需按照另一个答案中所示设置属性即可。