2016-08-03 3 views
3

В моей весне данные Neo4j 4 project - BeforeSaveEvent класс устарел.Весенние данные Neo4 - BeforeSaveEvent устарел

Кроме того, ранее я использовал следующий код для того, чтобы настройки созданы/обновлены даты для моих субъектов:

@EventListener 
public void handleBeforeSaveEvent(BeforeSaveEvent event) { 
    Object entity = event.getEntity(); 
    if (entity instanceof BaseEntity) { 
     BaseEntity baseEntity = (BaseEntity) entity; 
     if (baseEntity.getCreateDate() == null) { 
      baseEntity.setCreateDate(new Date()); 
     } else { 
      baseEntity.setUpdateDate(new Date()); 
     } 
    } 
} 

но сейчас этот слушатель не вызывается.

Есть ли замена для этой логики в Neo4j 4? Я по-настоящему ценю пример. Благодаря

ОБНОВЛЕНЫ

Конфигурация, описанная ниже, работает, но некоторые из моих тестов не из-за NULL датами ранее сохраненных лица .. что-то еще не так ..

После уточнения найден причина этого вопроса и ждал этого BugfixModifications during a onPreSave() event do not persist to the database

@Configuration 
@EnableExperimentalNeo4jRepositories(basePackages = "com.example") 
@EnableTransactionManagement 
public class Neo4jTestConfig { 

    @Bean 
    public Neo4jTransactionManager transactionManager() throws Exception { 
     return new Neo4jTransactionManager(sessionFactory()); 
    } 

    @Bean 
    public SessionFactory sessionFactory() { 
     return new SessionFactory("com.example") { 

      @Override 
      public Session openSession() { 
       Session session = super.openSession(); 

       session.register(new EventListenerAdapter() { 

        @Override 
        public void onPreSave(Event event) { 
         Object eventObject = event.getObject(); 
         if(eventObject instanceof BaseEntity) { 
          BaseEntity baseEntity = (BaseEntity) eventObject; 
          if (baseEntity.getCreateDate() == null) { 
           baseEntity.setCreateDate(new Date()); 
          } else { 
           baseEntity.setUpdateDate(new Date()); 
          } 
         } 
        } 

       }); 

       return session; 
      } 

     }; 
    } 

} 
+1

Облицовка с той же проблемой ... Я нашел [этот вопрос] (http://stackoverflow.com/questions/30604863/spring-data-neo4j-4-0-0-beforesaveevent-not-firing) здесь, на SO, и это то, что мы сделали на данный момент (всегда обновляем объекты графа через Neo4jTemplate вместо GraphRepository). Если вы используете шаблон, событие перед сохранением будет запущено. Я знаю, что это не идеальное решение, но, возможно, может помочь вам, пока вы не найдете лучший выбор. – troig

+1

@troig, спасибо! Я использую сочетание Session с SDN Repositories .. так выглядит, что это не вариант, особенно в случае репозитория. – alexanoid

+0

Да, я знаю, что это не очень хороший вариант ... В [sdn jira есть открытая проблема ] (https://jira.spring.io/browse/DATAGRAPH-710), возможно, вы могли бы посмотреть там и получить некоторую скидку. – troig

ответ

3

Вы должны быть с помощью Spring Dat a Neo4j (SDN) 4.2.0.M1. Это еще не было официально выпущено, но вы можете протестировать его, пока он проходит процесс выпуска данных Spring.

Код события в SDN устарел в пользу различных механизмов. Первый заключается в том, что Spring Data теперь поддерживает прослушиватели событий, поддерживающих транзакции. Вы можете проверить, как реализовать эти here. Номер второй - это то, что вы можете теперь авторизовать сеанс OGM Neo4j в своем приложении и использовать его возможности для событий (см. Метод register()).

Наконец-то вы можете вступать в брак с двумя концепциями вместе и получать события, генерируемые OGM, которые запускаются через Spring!

Документация придет, когда мы продолжим выпуск, но теперь не стесняйтесь играть с ней самостоятельно.

+0

Я до сих пор не могу найти рабочего решения .. мои тесты терпят неудачу с конфигурацией в моем вопросе. По некоторым причинам даты с этим подходом не сохраняются правильно. – alexanoid

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