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

时间:2011-06-20 19:33:07

标签: 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.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查询(也许是我 错误,假设是问题) 永远不会得到支持。
  • 有吗? 无论如何除了这个问题 获取数据库?
  • 如何 我可以告诉我是不是打了 数据库或转到Hibernate 缓存(我不太了解 休眠)。有输出可以 告诉我?

1 个答案:

答案 0 :(得分:6)

  1. 触发findBy*的{​​{1}} - 每flush()次刷新Criteria可能返回的任何对象。 这样做是为了确保Criteria返回所有匹配的对象。 看起来这个逻辑是在1.1中引入的。

  2. 尝试在Criteria中抓取对象。或者,更好的是,在开始当前事务之前/在事务开始之前,在Affiliation.withNewSession{ } ed对象变脏之前获取它。

  3. 启用Grails sql logging:How to log sql in grails 1.3.7