有时在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以仅将此持久数据包含在此服务中的查询中?
答案 0 :(得分:1)
您可以将服务标记为non-transactional以解决此问题:
class MyService {
static transactional = false
...
}
如果需要,您可以随时在事务内部进行单个操作。