injizieren wir erstellen eine Anwendung, wo wir Entity Updates in History Tabelle protokollieren müssen. Ich versuche, dies durch den Ruhezustand-Interzeptor zu erreichen, und wir könnten in der Lage sein, alle Änderungen zu bekommen, aber Schwierigkeiten beim Einfügen in die Audit-Tabelle.Wie spring repo in den Winterschlaf Interceptor
Meine JPA Konfiguration
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;
}
Mein Interceptor
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>();
}
}
}
}
in Verfahren afterTransactionCompletion Ich brauche alle -abschlussprüfungsgesellschaften in DB zu schreiben, ist der Frühling Autowire nicht, da diese Arbeit nicht geschafft Bean, gibt es eine Möglichkeit, DB-Sitzung in dieser Methode zu bekommen, so dass ich Einsätze durchführen kann.
Vielen Dank für Ihre Antwort. Der zweite Ansatz mit Anwendungskontext funktioniert in meinem Fall nicht. Ich bin mir nicht sicher, was ich falsch mache .. Versuch mit der ersten Appraktion –
Ich könnte Repo mit statischem Halter injizieren .. einige, wie Daten nicht in DB gespeichert werden. Ich habe meinen Frühling JPA Repo Transnational noch kein Glück .. irgendwelche Gedanken ..? –
hmmm, das ist wirklich ein anderes Thema, denke ich. Es hängt mit Ihrer 'TransactionManager'-Konfiguration zusammen. lass mich versuchen, dir zu helfen .... Ich habe die Antwort am Ende für eine typische TransactionManger Java-Konfiguration aktualisiert. Solange eine Transaktion beginnt, sollte die Persistenz funktionieren. –