2016-08-03 16 views
3

In meinem Projekt Spring Data Neo4j 4 - BeforeSaveEvent Klasse ist veraltet.Spring Data Neo4 - BeforeSaveEvent veraltet

Auch zuvor verwendete ich einen folgenden Code, um Setup erstellt/aktualisiert Termin für meine Entitäten:

@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()); 
     } 
    } 
} 

aber jetzt diese Hörer nicht aufgerufen wird.

Gibt es einen Ersatz für diese Logik in Neo4j 4? Ich werde ein Beispiel wirklich schätzen. Dank

AKTUALISIERT

Die nachfolgend beschriebene Konfiguration funktioniert, aber einige meiner Tests werden fehlschlagen, weil der NULL Daten auf einem zuvor gespeicherten Entitäten .. noch etwas falsch ist ..

Nach Klärung gefunden Grund für dieses Problem und warten auf dieser 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

Mit dem gleichen Problem konfrontiert ... Ich fand [diese Frage] (http://stackoverflow.com/questions/30604863/spring-data-neo4j-4-0-0-beforesaveevent-not-branding) hier auf SO und das haben wir im Moment gemacht (aktualisieren Sie Graph-Entities immer über Neo4jTemplate statt GraphRepository). Wenn Sie die Vorlage verwenden, wird das Ereignis vor dem Speichern ausgelöst. Ich weiß, dass es keine ideale Lösung ist, aber vielleicht kann es Ihnen helfen, bis Sie eine bessere Wahl getroffen haben. – troig

+1

@troig, danke! Ich benutze eine Mischung aus Session mit SDN-Repositories .. so sieht das aus, als ob dies keine Option wäre. – alexanoid

+0

Ja, ich weiß, es ist keine wirklich gute Option ... Es gibt ein offenes Problem in [sdn jira ] (https://jira.spring.io/browse/DATAGRAPH-710), vielleicht könntest du dort nachsehen und ein wenig Feedback bekommen. – troig

Antwort

3

Sie müssen sich mit Spring Dat ein Neo4j (SDN) 4.2.0.M1. Dies wurde noch nicht offiziell veröffentlicht, aber Sie können es testen, während es den Spring Data Release-Prozess durchläuft.

Der Ereigniscode in SDN wurde zugunsten einer Vielzahl von Mechanismen veraltet. Nummer eins ist, dass Spring Data jetzt transaktionsbewusste Event-Listener unterstützt. Sie können überprüfen, wie Sie diese here implementieren. Nummer zwei ist, dass Sie die Neo4j OGM Session jetzt automatisch in Ihre Anwendung einbinden und die Event-Funktionen nutzen können (siehe Methode register()).

Endlich kannst du die beiden Konzepte miteinander verbinden und OGM-generierte Events durch den Frühling schießen lassen!

Die Dokumentation wird kommen, wenn wir mit der Veröffentlichung fortfahren, aber jetzt können Sie selbst damit spielen.

+0

Ich kann immer noch keine funktionierende Lösung finden .. meine Tests scheitern mit einer Konfiguration in meiner Frage. Aus bestimmten Gründen werden Daten bei diesem Ansatz nicht korrekt gespeichert. – alexanoid