【问题标题】:Include unpersisted Hibernate data on Grails Domain queries在 Grails 域查询中包含未持久化的 Hibernate 数据
【发布时间】:2016-01-19 13:51:13
【问题描述】:

有时在 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 设置为仅将此持久数据包含在此服务内的查询中?

【问题讨论】:

    标签: hibernate grails


    【解决方案1】:

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

    class MyService {
    
        static transactional = false
    
         ...
    
    }
    

    如果需要,您始终可以在事务中进行单个操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 2018-04-18
      • 2012-02-16
      相关资源
      最近更新 更多