2016-08-29 2 views
1

Я работаю над проверкой, когда пользователь отправляется на покупку, в базу данных создается и сохраняется объект Purchase. Затем я беру id объекта и отправляю его в PayPal для создания кнопки (таким образом, я могу позже идентифицировать покупку). Однако, когда я пытаюсь восстановить идентификатор, он возвращает null.Получите идентификатор объекта домена после создания

Я попытался очистить его, прежде чем я получу идентификатор, но он все еще не работает.

Вот мой домен объект:

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 {} 
} 

Вот код, я бегу:

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

С точки зрения дизайна было бы лучше использовать отдельную последовательность в качестве бизнес-ключа для предоставления PayPal. Вы никогда не должны делиться первичными ключами с вашими данными с третьими сторонами. –

+0

Возможно, у вас есть ошибка при сохранении. Вы можете использовать 'save (failOnError: true)', чтобы выбросить ошибку, если она есть. –

ответ

3

Идентификатор является пустым, потому что ваш объект не сохраняется. Причина, по которой он не сохраняется, заключается в том, что вы не назначаете значение buttonId, и это свойство требуется. Вы можете подтвердить это с помощью:

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

Вам необходимо зафиксировать результат метода purchase.save(). Он возвращает обновленный объект домена с разрешенным идентификатором внутри. Поэтому ваш код должен выглядеть следующим образом:

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 

Обратите внимание, что если вы установите failOnError: истинный флаг в методе сохранения, то он будет бросать исключение, если есть подтверждение или спящий режим ошибок/SQL, которые мешают спасению метод. Я считаю, что мне нравится обработка исключений лучше, чем мягкие проверки, которые я изложил выше.

Кроме того, поскольку у вас нет блока ограничений в определении вашего домена, все поля будут иметь значение NULL: false по умолчанию, поэтому вы ДОЛЖНЫ указать значение для buttonId или домен не будет проверен, а метод purchase.save() вызов завершится неудачно.

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