2016-08-29 2 views
1

Ich arbeite an einem Checkout, wenn der Benutzer einen Einkauf tätigt, wird ein Purchase Objekt erstellt und in der Datenbank gespeichert. Ich nehme dann die id des Objekts und sende es an PayPal, um eine Schaltfläche zu generieren (auf diese Weise kann ich den Kauf später identifizieren). Wenn ich jedoch versuche, die ID zurückzuholen, gibt sie null zurück.ID des Domänenobjekts nach der Erstellung abrufen

Ich habe versucht, es zu löschen, bevor ich auf die ID zugreife, aber es scheint immer noch nicht zu funktionieren.

Hier ist meine Domain-Objekt:

package website 

import java.time.Instant 
import java.time.temporal.ChronoUnit 

class Purchase { 
    String buttonId 
    final Instant expires 
    private boolean complete 

    User user 
    Product product 

    Purchase(Product product, User user) { 
     this.product = product 
     this.user = user 

     expires = Instant.now().plus(1, ChronoUnit.DAYS) 
    } 

    void completePurchase() { 
     // confirm that the purchase hasn't been completed already 
     if (complete) { 
      throw new PurchaseAlreadyCompleteException() 
     } 

     complete = true 
    } 

    boolean isComplete() { 
     return complete 
    } 

    static class ButtonIdAlreadyInitializedException extends RuntimeException {} 

    static class PurchaseAlreadyCompleteException extends RuntimeException {} 
} 

Hier ist der Code Ich verwende:

Purchase purchase = new Purchase(product, user) 
purchase.save(flush: true) 
println 'purchase id: ' + purchase.id 
+1

Vom Designstandpunkt aus wäre es eine bessere Idee, eine separate Sequenz als Geschäftsschlüssel für PayPal zu verwenden. Sie sollten die Primärschlüssel für Ihre Daten niemals mit Dritten teilen. –

+0

haben Sie möglicherweise einen Fehler beim Speichern. Sie können 'save (failOnError: true)' verwenden, um einen Fehler auszulösen, wenn Sie einen haben. –

Antwort

3

Die ID ist null, weil das Objekt nicht gespeichert werden. Der Grund, warum es nicht gespeichert wird, liegt darin, dass Sie buttonId keinen Wert zuweisen und diese Eigenschaft erforderlich ist. Sie können dies überprüfen mit:

Purchase purchase = new Purchase(product, user) 
purchase.save(flush: true, failOnError: true) // will throw an exception if saving fails 
println 'purchase id: ' + purchase.id 
1

Sie müssen das Ergebnis der purchase.save() -Methode erfassen. Es gibt das aktualisierte Domänenobjekt mit der aufgelösten ID zurück. Daher sollten Sie den Code wie folgt aussehen:

Purchase purchase = new Purchase(product, user) 
purchase = purchase.save(flush: true) 
if (!purchase || purchase.hasErrors()) { 
    log.error("Failed to commit purchase - probable validation errors') 
} 
println 'purchase id: ' + purchase.id 

Beachten Sie, dass, wenn Sie die FailOnError gesetzt: true-Flag in der Speichermethode, dann wird es eine Ausnahme aus, wenn die Validierung sind oder Ruhezustand/SQL-Fehler, die die Speicherung der verhindern Methode. Ich finde, dass ich Exception-Handling besser mag als die Soft-Checks, die ich oben angegeben habe.

Da in Ihrer Domänendefinition keine Einschränkungen vorhanden sind, sind alle Felder standardmäßig nullwertfähig, dh Sie müssen einen Wert für buttonId angeben, andernfalls wird die Domäne nicht validiert, und die purchase.save() -Methode wird ignoriert Anruf wird fehlschlagen.

Verwandte Themen