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

ska*_*kaz 2 grails hibernate

我正在尝试将Grails应用程序从1.0.3升级到1.3.7并遇到异常:

 object references an unsaved transient instance - save the transient instance before flushing:
Run Code Online (Sandbox Code Playgroud)

我没有在触发的代码中进行任何保存.它在以下代码中

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)
    }
Run Code Online (Sandbox Code Playgroud)

对Affiliation.nfl的调用是:

public static Affiliation getNfl() {
           if (cacheNFL == null) {
            String key = ConfigurationHolder.config.nfl
            cacheNFL = Affiliation.findByKey(key)
        }
        return cacheNFL;
    }
Run Code Online (Sandbox Code Playgroud)

如果我删除cacheNFL并使其每次都进行实际获取,则代码可以正常工作.我的问题是:

  • 为什么之前有效呢?看起来像使用不是当前Hibernate查询(我可能是错误的,假设是问题)的缓存对象进行获取将永远不会被支持.
  • 除了获取数据库之外,还有这个问题吗?
  • 如何判断我是在访问数据库还是进入Hibernate缓存(我不太了解Hibernate).有输出可以告诉我吗?

Vic*_*nko 6

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

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

  3. 启用Grails sql logging:如何在grails 1.3.7中记录sql