2012-06-20 3 views
2

Это длинный вопрос и странная проблема, которую я надеюсь решить. Мой клиент отправляет объект JSON на мой сервер. Я сохраняю отчет и использую идентификатор, сгенерированный для другой цели, в моих jms, но иногда получаю нулевой идентификатор, когда мое добавление было успешным. Как я могу это предотвратить?Идентификатор объекта Grails после вставки

В моем домене

int id 
String reportImage 
Date reportDateTime; 
static constraints = { 
    id(blank:false, unique:true) 
    reportImage (blank:true, nullable:true) 
    reportDateTime (blank:false) 
} 
def afterInsert = { 

    id= this.id 

} 

В моем контроллере, я

JSONObject json = request.JSON   
AddReportService svc = new AddReportService()   
def id= svc.addReport(json) 
json.put("id",id) 
jmsService.send(queue:'msg.new', json.toString()) 

В моей службе отчетов надстройки,

JSONObject obj = report 
Reports reports = new Reports() 
     ... 
reports.save(flush:true) 
myid = reports.id 
return myid 

В моих JMS,

def jmsService 
static transactional = false 
static exposes = ['jms'] 


@Queue(name='msg.new')  
def createMessage(msg) { 
    JSONObject json = new JSONObject(msg) 
    int id = json.get("id") // sometimes is null, but report was added. How to prevent? 


    AlertManagement am = new AlertManagement() 
    am.IsToSendAlert(id) 

ответ

4

Если идентификатор равен null после вставки, это почти наверняка означает, что вставка не сработала. Когда вы вызываете reports.save(), вы должны либо добавить failOnError: true, либо проверить возвращаемое значение.

Несколько замечаний о вашем коде:

  • вам не нужно объявлять свойство идентификатора в предметной области, Grails добавляет один неявно (типа long).
  • Аналогично, ограничения id являются избыточными.
  • Назначение id = this.id в обработчике afterInsert ничего не делает и не нужно. GORM гарантирует, что идентификатор объекта домена правильно настроен после вставки.

Кроме того, как и когда объекты сохраняются в граале, это не всегда просто, особенно если вы добавляете ручную промывку и операции. Это необходимо прочитать, чтобы получить лучшее понимание: http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/

0

Вы пытаетесь перезаписать свойство id. Обычно класс домена Groovy имеет свойство id по умолчанию. Поэтому нет необходимости определять свойство id. Вы можете получить доступ к свойству id без определения его в классе домена.

класс Domain

class A { 
    String reportImage 
    Date reportDateTime 

} 

В классе обслуживания

def instance=new A("xxx",new Date()) 
if(instance.save()) 
{ 
    return instance.id 
} 
Смежные вопросы