2017-11-12 3 views
0

ich die Business-Logik, dieWie ich NucleusUserException durch einen gewissen Wert zu erhalten nicht verwaltet von einem Objekt-Manager

1) erfordert tun, eine Aktion wie Graf oder ‚gefunden ID von oben 1 Artikel mit dem Feld größer ist als ein‘ vermeiden kann , dh einige Leseaktionen über Entität A ausführen. Die Anzahl oder Suche umfasst mehr als 25 Elemente, sodass viele Entitätsgruppen betroffen sind. 2) dann eine Aktion auf einem anderen Unternehmen B tun und die geänderte Einheit 3) bestehen jetzt ich das einzig Objekt für Entität A ändern und will es

bestehen bleiben, wenn ich mir nicht Frühling @Transactional auf meiner Methode hab Objekt mit der ID "A @ someHash" wird von einem anderen Objektmanager beim Aufruf von 3) verwaltet. Laut System.out.println (NucleusJPAHelper.getObjectState (busRouteToCheck)); das Objekt in persistenten Zustand

Wenn ich Frühling @Transactional die ganze Methode gestülpt verwenden, ich habe „zu viele Entity Gruppen geöffnet in der Transaktion“

Wie ich Ergebnisse von 1 zwingen kann) nicht verwaltet werden von Object Manager, um schließlich einige Long-Wert und Prozess 3) wie ich mit A das erste Mal in meiner Methode zu behandeln. Schließlich brauche ich Elemente mehrerer Entitätsgruppen gelesen werden und nur zwei innerhalb der Transaktion aktualisiert werden.

Was ich versucht habe, um zu arbeiten: 1) Dividieren verwenden Sie die gesamte Methode in 3 andere, wo 2 ist ohne @Transaction, 1 und 3 haben @Transaction; Hier habe ich noch NucleusUserException; 2) mit der gleichen Bedingung habe ich versucht, 2 verschiedene Transaktionsmanager zu verwenden, die zuerst Aufrufe für schreibgeschützte Aufrufe (Methode 1) und Schreiben mit der zweiten (Methode 3) tätigen.

Gibt es eine explizite Möglichkeit, den Objektmanager zu steuern?

Dependenciies verwendet werden:

<dependency> 
      <groupId>org.datanucleus</groupId> 
      <artifactId>datanucleus-api-jdo</artifactId> 
      <version>3.1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.datanucleus</groupId> 
      <artifactId>datanucleus-api-jpa</artifactId> 
      <version>3.1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.appengine.orm</groupId> 
      <artifactId>datanucleus-appengine</artifactId> 
      <version>2.1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.datanucleus</groupId> 
      <artifactId>datanucleus-core</artifactId> 
      <version>3.1.1</version> 
     </dependency> 

und Enhancer Plugin

<plugin> 
       <groupId>org.datanucleus</groupId> 
       <artifactId>maven-datanucleus-plugin</artifactId> 
       <version>3.1.3</version> 
       <configuration> 
        <!-- Make sure this path contains your persistent classes! --> 
        <!--<mappingIncludes>**/domain/*.class</mappingIncludes>--> 
        <!--<persistenceUnitName>transactions-optional</persistenceUnitName>--> 
        <verbose>true</verbose> 
        <api>JPA</api> 
        <!--<mappingIncludes>com/appspot/Player.class</mappingIncludes>--> 
        <!--<metadataIncludes>com/appspot/Player.class</metadataIncludes>--> 
        <fork>false</fork> 
       </configuration> 
       <executions> 
        <execution> 
         <phase>process-classes</phase> 
         <goals> 
          <goal>enhance</goal> 
         </goals> 
        </execution> 
       </executions> 
       <dependencies> 
        <!--<dependency> 
         <groupId>asm</groupId> 
         <artifactId>asm-commons</artifactId> 
         <version>3.3.1</version> 
        </dependency>--> 
        <dependency> 
         <groupId>org.datanucleus</groupId> 
         <artifactId>datanucleus-api-jpa</artifactId> 
         <version>3.1.1</version> 
        </dependency> 
        <dependency> 
         <groupId>org.datanucleus</groupId> 
         <artifactId>datanucleus-core</artifactId> 
         <version>3.1.1</version> 
        </dependency> 
        <dependency> 
         <groupId>org.datanucleus</groupId> 
         <artifactId>datanucleus-enhancer</artifactId> 
         <version>3.1.1</version> 
        </dependency> 
       </dependencies> 
      </plugin> 
+0

JPA hat einen EntityManager nicht ein ObjectManager, und Sie können Objekte mit JPA –

+0

lösen Ich tat es (in der Tat habe ich em.close(), um alle Objekte aus dem Entity Manager lösen mit Objekten aus Anfrage 1), aber es hilft nicht. ObjectManager ist eine interne von frühen Versionen von Data Nucleus. –

+0

Wenn ein Objekt losgelöst wird, befindet es sich nicht in dem von Ihnen angegebenen Zustand –

Antwort

1

ist kann ich nicht sagen kann ich das detaillierte Verständnis von etwas bekam tief in vorkommendes Googles JPA-Implementierung und den Erhalt der Ausnahme Ich habe Gesendet. Stattdessen habe ich das globale Problem gelöst, mit dem ich konfrontiert war. Ich glaube, Sie stehen vor dem gleichen Problem, wenn Sie sich mit der Ausnahme befassen. Ich habe versucht, die Einschränkungen bei der Änderung einer geringen Anzahl von Objekten innerhalb von Transaktionen und dem Lesen von may-Objekten zu umgehen, bei denen Transaktionen nicht benötigt werden (da keine Transaktionsaktualisierung aufgrund der oben genannten Ausnahmen fehlschlägt).

Das Problem ist architektonisch gelöst: 1) Sie sollten separate Methoden in Service-Schicht zum Lesen der Entitäten erstellen oder Zähler erhalten und sie nicht transaktional machen 2) separate Methoden in den Service-Schichten erstellen die Ergebnisse von nicht-transaktionalen Methoden als Parameter und Aktualisierung der Entitäten; Machen Sie diese Methoden transaktional 3) in Controller-Ebene oder in Ihrer benutzerdefinierten Ebene unterhalb des Controllers, aber über dem Service rufen Sie diese Methoden separat auf!

Mein Fehler war, dass ich angenommen habe, dass die @Transactional-Annotation von Spring auch dann sinnvoll ist, wenn die Methode mit @Transactional von einer anderen Methode ohne @Transaction1 aufgerufen wird. Das ist falsch: Aufgrund der Aspect-Natur der Annotation sind sie nur sinnvoll, wenn die Methoden von außerhalb des Klassenobjekts aufgerufen werden. In meinen Beispielen habe ich also den gesamten Aufruf innerhalb der einzigen Transaktion (mit zu vielen Entitätsausnahmen) oder innerhalb keiner Transaktion (daher wird das Objekt mit ID ... von einem anderen Objektmanager verwaltet). Das untransaktionale Verhalten und das transaktionale Verhalten von den verschiedenen Methoden zu trennen und sie von außen anzurufen, hat mir dabei geholfen.

Verwandte Themen