gpt4 book ai didi

hibernate - Grails - 未保存的 transient 实例异常

转载 作者:行者123 更新时间:2023-12-02 08:53:58 25 4
gpt4 key购买 nike

我正在尝试将 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缓存(我不太了解 hibernate )。有没有可以输出给我看看?

最佳答案

  1. 这是findBy*触发 flush() - 每Criteria刷新可能由 Criteria 返回的任何对象。这样做是为了确保Criteria返回所有匹配的对象。貌似这个逻辑是1.1引入的。

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

  3. 启用 Grails sql 日志记录:How to log sql in grails 1.3.7

关于hibernate - Grails - 未保存的 transient 实例异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6416421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com