В классе что реализует EmptyInterceptor, нужно создать EntityManager и сохранить новий обєкт

167
19 октября 2018, 17:50

У меня єсть клас

public class PlainUserInterceptor extends EmptyInterceptor {
private static Logger LOGGER = LoggerFactory.getLogger(PlainUserInterceptor.class);
private Set<PlainUserHistory> updates = new HashSet<>();
@Override
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
    if(entity instanceof PlainUserEntity){
        for(int i = 0; i < currentState.length; i++){
            if(!currentState[i].equals(previousState[i])){
                System.out.println("Changed filds " + propertyNames[i] + "  " + "previousState " + previousState[i] + " currentState " + currentState[i] );
                PlainUserHistory userHistory =  new PlainUserHistory();
                userHistory.setVariableName(propertyNames[i]);
                userHistory.setNewValue((String) currentState[i].toString());
                userHistory.setOldValue((String) previousState[i].toString());
                userHistory.setUpdateDate(Calendar.getInstance());
     userHistory.setPlainUserEntity((PlainUserEntity) entity);
                updates.add(userHistory);
            }
        }
    }
    return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types);
}
@Override
public void postFlush(Iterator entities) {
   if(!updates.isEmpty()){
       EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "lending-PU" );
       EntityManager entitymanager = emfactory.createEntityManager();
       for (PlainUserHistory entity:updates) {
           entitymanager.getTransaction().begin();
           entitymanager.persist(entity);
           entitymanager.getTransaction().commit();
       }
   }
}

я хочу в методе onFlushDirty найти поля которые пользователь изменил. Записую их в

private Set<PlainUserHistory> updates = new HashSet<>();

а в postFlush я хочу их сохранить в базу, но у меня падает ошибка

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: lending-PU] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at com.ekassa.entityAuditing.PlainUserInterceptor.postFlush(PlainUserInterceptor.java:54)
at org.hibernate.event.internal.AbstractFlushingEventListener.postPostFlush(AbstractFlushingEventListener.java:390)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:49)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:465)
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2963)
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2339)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.beforeCompletion(JtaTransactionCoordinatorImpl.java:316)
at org.hibernate.resource.transaction.backend.jta.internal.synchronization.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:47)
at org.hibernate.resource.transaction.backend.jta.internal.synchronization.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:37)
at org.jboss.as.txn.service.internal.tsr.JCAOrderedLastSynchronizationList.beforeCompletion(JCAOrderedLastSynchronizationList.java:116)
at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76)
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:368)
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:91)
at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1200)
... 42 more
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Unable to open JDBC connection for schema management target
at org.hibernate.tool.schema.internal.TargetDatabaseImpl.prepare(TargetDatabaseImpl.java:42)
at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:57)
at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:134)
at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:101)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:470)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
... 62 more

Caused by: java.sql.SQLException: IJ031017: You cannot set autocommit during a managed transaction
at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.setJdbcAutoCommit(BaseWrapperManagedConnection.java:973)
at org.jboss.jca.adapters.jdbc.WrappedConnection.setAutoCommit(WrappedConnection.java:787)
at org.hibernate.tool.schema.internal.TargetDatabaseImpl.prepare(TargetDatabaseImpl.java:39)
... 68 more

В чем проблема, что я сделал неправильно?

Я использую wildfly 10, Hibernate 4.3.7 и EJB3

READ ALSO
AWS размер каталога (папки)

AWS размер каталога (папки)

мне интересно, как взять размер конкретной папки в amazonClient ? Я знаю, что все внутри Амазона - это обьектыНо ведь как-то же можно взять размер...

137
Не работает Seter в массив на Java

Не работает Seter в массив на Java

Не получается понять причину, почему не работает сетерВыставил значение в сетере - а результат инициализации всё равно 0

153
Сложение значений одинаковых ключей

Сложение значений одинаковых ключей

Есть значение (Double) и ключ (String)

127
Не отображается средее арифметическое

Не отображается средее арифметическое

В общем, нужно выводить среднее арифметическое в activity 3

169