我正在尝试将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并使其每次都进行实际获取,则代码可以正常工作。我的问题是:
答案 0 :(得分:6)
触发findBy*
的{{1}} - 每flush()
次刷新Criteria
可能返回的任何对象。
这样做是为了确保Criteria
返回所有匹配的对象。
看起来这个逻辑是在1.1中引入的。
尝试在Criteria
中抓取对象。或者,更好的是,在开始当前事务之前/在事务开始之前,在Affiliation.withNewSession{ }
ed对象变脏之前获取它。
启用Grails sql logging:How to log sql in grails 1.3.7