мы создаем одно приложение, в котором нам нужно регистрировать обновления Entity в таблице History. Я пытаюсь достичь этого с помощью перехватчика спящего режима, и мы смогли бы добиться всех изменений, но с трудностями в их вставке в таблицу аудита.Как добавить весеннее репо в перехватчик гибернации
Моя конфигурация JPA
public class JPAConfiguration {
----
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() throws SQLException {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(dataSource());
factoryBean.setPackagesToScan(new String[] {"com.yyy.persist"});
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setShowSql(true);
// thsi is required in order to enable Query DSL
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.Oracle10gDialect");
factoryBean.setJpaVendorAdapter(vendorAdapter);
// factoryBean.setMappingResources(mappingResources);
// adding hibernate interceptor
Properties jpaProperties = new Properties();
jpaProperties.setProperty("hibernate.ejb.interceptor", "com.yyy.admin.service.AuditInterceptor");
factoryBean.setJpaProperties(jpaProperties);
return factoryBean;
}
Мои перехватчик
public class AuditInterceptor extends EmptyInterceptor {
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState,
String[] propertyNames, Type[] types) {
if (entity instanceof Auditable) {
// updates++;
for (int i = 0; i < propertyNames.length; i++) {
if ((currentState[i] == null && previousState[i] != null)
|| (currentState[i] != null && previousState[i] == null) || (currentState[i] != null
&& previousState[i] != null && !currentState[i].equals(previousState[i]))) {
AuditLog audit = new AuditLog();
audit.setAction("UPDATE");
audit.setFieldChanged(propertyNames[i]);
audit.setOldvalue(previousState[i] != null ? previousState[i].toString() : "");
audit.setNewvalue(currentState[i] != null ? currentState[i].toString() : "");
audit.setTimeStamp(new Date());
audit.setUsername(userName);
entities.add(audit);
}
}
// iterate elements on the report build a entity
}
return false;
}
public void afterTransactionCompletion(Transaction tx) {
if (tx.wasCommitted()) {
if (entities != null) {
for (AuditLog e : entities) {
System.out.println(e);
//.save(e);
}
entities = new ArrayList<AuditLog>();
}
}
}
}
в методе afterTransactionCompletion мне нужно написать все аудиторские объекты в БД, Autowire не работает, так как это не пружинные удалось bean, есть ли способ получить сеанс DB в этом методе, чтобы я мог выполнять вставки.?
Спасибо за ваш ответ. Второй подход с контекстом приложения не работает в моем случае .. не знаю, что я там делаю. Попытка с первой оценкой –
Я мог бы вставить репо с помощью статического держателя .. некоторые, как данные не сохраняются в БД. Я сделал свою весеннюю ретрансляцию JPA транснациональной, еще не повезло .. какие-то мысли ..? –
hmmm, это действительно другая тема, я думаю. Это связано с настройкой «TransactionManager». позвольте мне попытаться помочь вам .... Я обновил ответ в конце для типичной конфигурации java TransactionManger. Пока начинается транзакция, упор должен работать. –