gpt4 book ai didi

grails - hasMany 保存不适用于 Grails 2.4.2 升级

转载 作者:行者123 更新时间:2023-12-02 14:23:52 26 4
gpt4 key购买 nike

我最近从 Grails 2.2.5 升级到 2.4.2 。升级后我的很多 hasMany 关系都没有保存。

例如:

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
}

在执行事务的服务上,我确实在类 def 上方添加了一个 @Transactional。我还尝试为每个 Grails 2.4.2: Strange cascading save behaviour in nested transactions 添加一个 @Transactional(propagation=Propagation.REQUIRES_NEW) .如果我回滚 Grails 升级(相同的 Controller 、服务和 View 代码),则节点集会正确持久化,但是,对于 Grails 2.4.2,它不会。我还在保存之前和之后通过打印对象的节点进行了检查,它显示在控制台上,但是当我的应用程序重定向到 ListView 时,它不会显示并且不会保留在任何地方。

- 更新 -
这仍然发生在 Grails 2.4.3
我也相信它可能与连接表有关,但我不知道为什么。容器在参数绑定(bind)之后附加了节点,但在 .save() 之后它不会持久化到连接表。

- 更新 -
抱歉,域类代码的帖子有错误,已更新,现在正确。希望有人可以阐明我现在所缺少的东西。

出现此问题的原因是 Nodes 集合未持久化到 NODE_CONTAINERS 表中的 Container 实例中。

- 更新 -
问题正在进行中。调试时,我使用 Grails 数据源创建了一个新的 groovy Sql 实例,并手动将节点插入到 NODE_CONTAINERS 表中。查看 Container show gsp 时,所有内容都正确保存并正确调用。所以看起来 GORM 在读取实例时正确地处理了连接表,但仍然不确定为什么它没有正确地将节点保存到连接表中。

错误演示的示例应用程序:
  • 使用 Grails 2.2.5(2.2.5 分支)的工作应用程序
  • 使用 Grails 2.4.3(MASTER 分支)
  • 时出现上述错误的应用程序

    ( https://github.com/bwagner5/grailsCollectionsDebugApp/tree/master)

    Grails 数据绑定(bind)器:

    问题似乎是 Grails Data Binder。 Spring Data Binder 工作正常(默认在 2.2.x 中,您可以在 2.3.x 但不是 2.4.x 中覆盖 Grails binder)
    我已经加入了 JIRA,但仍然想看看现在是否有解决方法:
    https://jira.grails.org/browse/GRAILS-11638

    最佳答案

    我建议实际上添加单独的连接类,这也是 Burt Beckwith 提出的建议,您会发现 Grails Spring Security Core 项目中使用了这种做法。例如,只有您的 Node 和 Container 类,您最终会得到:

    class Node {
    String name
    String description
    Set<NodeContainer> nodeContainers = []
    static hasMany = [nodeContainers: NodeContainer]
    }

    class Container {
    String name
    CustomGlobe customGlobe

    //potentially add a helper method for fetching the nodes, but no GORM specification should be made on this class
    }


    class NodeContainer {
    Container container
    Node node

    static NodeContainer addNodeContainer(Node node, Container container){
    def n = findByNodeAndContainer(node, container)
    if(!n){
    n = new NodeContainer(container: container)
    node.addToContainers(n)
    n.save()
    }
    }

    // Other helper methods such as remove and table mappings if necessary
    }

    通过这种方式,您一次创建和删除一个连接,而不是要求休眠加载整个集合,然后从中添加/删除项目。您还消除了在两个类上都有 hasMany 的需要,这可以在大型集合上具有性能和保存问题。通过实现这种模式,我已经设法解决了我所有的时髦保存问题。祝你好运,我希望这会有所帮助!

    关于grails - hasMany 保存不适用于 Grails 2.4.2 升级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24870689/

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