Hibernate Grails-未保存的瞬态实例异常

Hibernate Grails-未保存的瞬态实例异常,hibernate,grails,Hibernate,Grails,我试图将Grails应用程序从1.0.3升级到1.3.7,但遇到异常: object references an unsaved transient instance - save the transient instance before flushing: 我没有在触发的代码中进行任何保存。它在下面的代码中 public static Season getCurrentSeason() { String yearString = ConfigurationHolder.c

我试图将Grails应用程序从1.0.3升级到1.3.7,但遇到异常:

 object references an unsaved transient instance - save the transient instance before flushing:
我没有在触发的代码中进行任何保存。它在下面的代码中

public static Season getCurrentSeason() {
        String yearString = ConfigurationHolder.config.year
        assert yearString != null: "need to configure season"
        int year = Integer.parseInt(yearString)

        Affiliation nfl = Affiliation.nfl;
        return Season.findBySeasonKeyAndLeague(year, nfl)
    }
呼叫Affiliation.nfl是:

public static Affiliation getNfl() {
           if (cacheNFL == null) {
            String key = ConfigurationHolder.config.nfl
            cacheNFL = Affiliation.findByKey(key)
        }
        return cacheNFL;
    }
如果我删除了cacheNFL并让它每次都进行真正的获取,那么代码就可以工作了。我的问题是:

  • 以前为什么这样做?看来 就像用缓存的 对象,该对象不是当前 Hibernate查询(可能是我) 错误地,假设是问题) 永远不会得到支持
  • 有吗 不管怎么说,除了 获取数据库
  • 怎么 我能告诉你我是不是在打电话吗 数据库或进入休眠状态 缓存(我不太了解 冬眠)。是否有输出可以 给我看
  • 是由*查找的
    触发了
    flush()
    -每个
    条件
    都会刷新该
    条件可能返回的任何对象。
    这样做是为了确保
    条件
    返回所有匹配的对象。 看起来这个逻辑是在1.1中引入的

  • 尝试在
    Affiliation.withNewSession{}
    中获取对象。或者,最好在开始当前事务之前/在事务开始时,在
    flush()
    ed对象变脏之前获取它

  • 启用Grails sql日志记录:


  • 谢谢你的意见。我真的不知道你的第一点和第二点是什么意思——我对这一点很陌生。所以,当我传入缓存的从属对象时,它会刷新它,这本质上是调用save?你能详细说明你的观点吗?非常感谢你的帮助。不是缓存实体,而是缓存初始化(您的
    附属关系.findByKey()
    )导致
    flush()
    flush()
    是的,就像
    save()
    一样,将更改写入数据库。只是它没有提交-如果您
    discard()
    它或实际上没有
    save()
    任何内容,它将自动回滚。(我可能对Hibernate的内部结构有误解,但这是我的想法)2。为了不刷新当前的Hibernate会话(),您可以在不同的会话中运行代码,这就是
    .withNewSession{}
    所做的。但是,在将对象附加到当前会话之前,您将无法保存/连接其他会话中的对象。