在Grails Domain查询中包含未加载的Hibernate数据

时间:2016-01-19 13:51:13

标签: hibernate grails

有时在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 个答案:

答案 0 :(得分:1)

您可以将服务标记为non-transactional以解决此问题:

class MyService {

    static transactional = false

     ...

}

如果需要,您可以随时在事务内部进行单个操作。