2016-01-19 2 views
0

Иногда в Grails службе мне нужно обрабатывать много сделки между двумя до трех таблиц:Включите unpersisted данные Hibernate на Grails домен запросов

class MyService { 
    void saveOwner(Map params) { 
     ... 
     params.get("schedules").each { saveSchedule(it) } 
    } 

    void saveSchedule(Owner owner, Map schedule) { 
     Schedule s 
     if(schedule.get("id") != null) { 
      s = Schedule.createCriteria().get { 
       eq("owner", owner) 
       eq("schedule", schedule.get("seqNo")) 
      } 
     } 

     if(s == null) { 
      s = new Schedule() 
      schedule.put("seqNo", generateSeqNo(owner)) 
     } 

     s.setProperties(schedule) 
     s.save(faileOnError: true) 
    } 

    Long generateSeqNo(Owner owner) { 
     Long seqNo = Schedule.createCriteria().get { 
      projections { 
       max("seqNo") 
      } 
      eq("owner", owner) 
     } 

     if(seqNo == null) { seqNo = 0 } 
     return ++seqNo 
    } 
} 

Теперь в методе generateSeqNo() всегда возвращает один и тот же порядковый номер. Похоже, что Hibernate не включает экземпляры домена по умолчанию, которые еще не сброшены в базу данных. Как я могу установить Grails для включения этих сохраняемых данных только в запросы внутри этой службы?

ответ

1

Вы можете отметить службу как non-transactional, чтобы преодолеть эту проблему:

class MyService { 

    static transactional = false 

    ... 

} 

Вы всегда можете совершать разовые операции внутри транзакции, если это необходимо.

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