2014-08-02 5 views
2

Я конвертирую конфигурацию на основе XML из приложения Spring. Это то, что часть конфигурации выглядит в XML:Как использовать перехватчик объектов Hibernate с менеджером транзакций JPA?

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL82Dialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.use_sql_comments">true</prop> 
      <prop key="hibernate.format_sql">true</prop> 
      <!--<prop key="hibernate.hbm2ddl.auto">create-drop</prop> --> 
     </props> 
    </property> 
    <property name="packagesToScan" value="net.vivin" /> 
</bean> 

<bean id="timeStampedEntityInterceptor" class="net.vivin.myapp.hibernate.interceptor.TimeStampedEntityInterceptor" /> 

<bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
     p:sessionFactory-ref="sessionFactory" 
     p:entityInterceptor-ref="timeStampedEntityInterceptor"> 
</bean> 

Посмотрев на this answer, я могу видеть, что лучшая практика заключается в использовании менеджера транзакций JPA вместо менеджера транзакций библиотеки Hibernate.

Я не могу понять, как установить перехватчик объектов в менеджере транзакций JPA. Кто-нибудь знает, как это можно сделать? Конфигурация на основе XML тоже прекрасна, потому что я могу преобразовать ее в Java. В моей Java конфигурации, менеджер транзакций все у меня есть:

@Bean 
public PlatformTransactionManager getTransactionManager(EntityManagerFactory entityManagerFactory) { 
    JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); 
    jpaTransactionManager.setEntityManagerFactory(entityManagerFactory); 
    return jpaTransactionManager; 
} 

Однако JpaTransactionManager не имеет никакого способа, чтобы установить перехватчик. Кто-нибудь знает, как это можно сделать? Или мне просто нужно будет использовать диспетчер транзакций Hibernate?

+0

Любые обновления по этому вопросу? – Amogh

+0

@Amogh Да. Мое решение состояло в том, чтобы полностью отказаться от перехватчика спящего режима и преобразовать его в слушателя JPA. Это тоже немного чище. –

ответ

0

Вы можете добавить EntityInterceptor в определение LocalSessionFactoryBean. LocalSessionFactoryBean - это тип Hibernate.

1

Вы можете использовать один пф следующий Hibernate properties (в persistence.xml или поставить их в JPATransactionManager):

  • hibernate.ejb.interceptor: перехватчик будет общим для всех сессий, что делает этот перехватчик Сфера охвата SessionFactory.

  • hibernate.ejb.interceptor.session_scoped: новый экземпляр будет предоставлен на каждый сеанс, что сделает его границей сеанса перехватчика.

2

Как оказалось, я собирался сделать это совершенно неправильно. Решение состояло в том, чтобы не пытаться использовать Hibernate-перехватчик объектов с моим кодом. Вместо этого я решил использовать прослушиватель JPA и использовал аннотацию @EntityListeners на моем объекте. Это, по сути, имеет ту же функциональность, что и перехватчик.

Смежные вопросы