我最近从Grails 2.2.5升级到2.4.2。升级后,我的很多hasMany关系都没有保存。hasMany保存不工作Grails 2.4.2升级
例如:
Domains:
class Node {
String name
String description
static belongsTo = CustomGlobe
static hasMany = [containers: Container]
}
class Container {
String name
CustomGlobe customGlobe
static belongsTo = Node
static hasMany = [nodes: Node]
}
class CustomGlobe {
String name
static belongsTo = CustomLocation
static hasMany = [customLocations: CustomLocation, nodes: Node]
}
class CustomLocation {
String name
String description
}
在执行我添加了@Transactional类DEF上述交易的服务。我还试图根据Grails 2.4.2: Strange cascading save behaviour in nested transactions添加@Transactional(propagation = Propagation.REQUIRES_NEW)。如果我回滚Grails升级(相同的控制器,服务和视图代码),节点集合将被正确保存,但是,对于Grails 2.4.2而言,它不会。我也在保存之前和之后通过打印对象的节点进行了检查,并且它显示在控制台上,但是当我的应用程序重定向到列表视图时,它不会显示并且不会在任何地方持久保存。
--UPDATE-- 这仍然发生在Grails 2.4.3 我也相信它可能与连接表有关,但我不明白为什么。容器在params绑定后具有附加的节点,但在.save()之后,它不会保留到连接表中。
--UPDATE-- 对不起,域类代码的帖子中有错误,它已被更新,现在是正确的。希望有人能够阐明我现在想念的东西。
Nodes集合未被持久保存到NODE_CONTAINERS表中的Container实例时发生此问题。
--UPDATE - 问题正在进行中。在调试时,我使用Grails数据源创建了一个新的Groovy Sql实例,并手动将节点插入到NODE_CONTAINERS表中。一切正确保存并在查看容器show gsp时被正确调用。所以看起来,GORM在读取实例时正确地处理了连接表,仍然不确定为什么它没有正确地将节点保存到连接表中。
应用示例演示的错误:
- 工作的应用使用Grails 2.2.5(2.2.5分支)以上使用Grails 2.4.3(MASTER分支)描述
- 应用表现出错误
(https://github.com/bwagner5/grailsCollectionsDebugApp/tree/master)
Grails的数据粘合剂:
这个问题似乎是Grails数据绑定器。 Spring Data Binder工作正常(在2.2.x中是默认的,你可以在2.3.x中重写Grails联编程序,但不能在2.4.x中) 我已经放入了JIRA,但仍然希望看看是否有解决方法现在: https://jira.grails.org/browse/GRAILS-11638
您是否正确升级了所有插件?一些老插件与新的Grails存在错误。 – wwarlock
是的,我没有正确升级。它似乎不喜欢joinTable。如果我在绑定参数数据后打印对象,我可以看到节点的集合,但在保存()后,它们不见了。我检查了hasErrors,它没有任何东西。其他一切都正确(名称和说明)。有什么想法吗? –
'Node'有许多'Container','Container'有很多'Node',但'Node'属于'CustomGlobe',而不是'Container'。那是故意的吗? –