Как я могу настроить StatementInspector в Hibernate?

https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/Interceptor.html говорит, что onPrepareStatement(String sql) устарел. Вместо этого укажите StatementInspector, если вы хотите проверять и изменять операторы SQL.

Но мне не ясно, как я могу настроить StatementInspector в Hibernate на уровне приложения (я не хочу устанавливать его на каждом уровне сеанса гибернации).


person gosachin1    schedule 23.08.2016    source источник


Ответы (3)


Не делай так)

Вам нужно всего две вещи:

  1. Добавьте свойство в persistence.xml:

имя свойства = "hibernate.session_factory.statement_Included" значение = "полное имя класса"

  1. Напишите свой класс слушателя, реализовав интерфейс org.hibernate.resource.jdbc.spi.StatementInspector.

Выгода!

person empyros    schedule 29.08.2017

Лучший способ зарегистрировать StatementInspector — использовать свойство конфигурации hibernate.session_factory.statement_inspector.

Таким образом, не имеет значения, загружаете ли вы Hibernate с помощью JPA (например, Spring Data JPA) или собственного Hibernate (например, Spring с HibernateTranscationManager и LocalSessionFactoryBean).

Таким образом, вы можете предоставить 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, представляющий полностью определенный класс, реализующий интерфейс StatementInspector, либо Class<? extends StatementInspector>, либо StatementInspector ссылку на объект.

person Vlad Mihalcea    schedule 04.06.2019

Чтобы заставить это работать, вы должны загрузить 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);
}

Добавьте sources.addAnnotatedClass() для каждого pojo с аннотацией JPA в вашем приложении. Почти готово здесь. Теперь создайте класс, который реализует 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, и ваше приложение все равно должно работать нормально.

Все готово!

person Jason Louro    schedule 29.08.2016
comment
в этом нет необходимости, просто установите свойство, как показано в другом ответе. - person Alex R; 05.06.2019