对于批导入中的所有Grails域对象,不会保留一袋字符串

对于批导入中的所有Grails域对象,不会保留一袋字符串,grails,grails-2.0,Grails,Grails 2.0,在以JSON格式导入用户域对象时,我遇到了一个奇怪的问题。 我们有一个导入器服务,它循环通过从外部服务导入的JSONArray。对于用户在JSON中没有任何语言的情况,服务逻辑具有回退功能。 奇怪的是,如果JSON包含数百个对象,那么只有前200个左右的用户在导入后才正确地分配了默认语言。但是,如果在每次迭代中手动使用user.saveflush:true而不是user.save刷新Hibernate会话,则所有用户都具有默认语言 简化域: class User { String fir

在以JSON格式导入用户域对象时,我遇到了一个奇怪的问题。 我们有一个导入器服务,它循环通过从外部服务导入的JSONArray。对于用户在JSON中没有任何语言的情况,服务逻辑具有回退功能。 奇怪的是,如果JSON包含数百个对象,那么只有前200个左右的用户在导入后才正确地分配了默认语言。但是,如果在每次迭代中手动使用user.saveflush:true而不是user.save刷新Hibernate会话,则所有用户都具有默认语言

简化域:

class User {
    String firstname
    String surname
    // ..

    static hasMany = [languages: String]
    static mapping = {
        languages cascade: "all-delete-orphan"
    }
}
服务代码如下所示:

private static final String DEFAULT_LANGUAGE = "en"

List<User> importUsers() {
    JSONArray users = remoteService.getUsers()
    users?.collect { JSONObject o ->
        User user = User.findById(o.getLong("id")) ?: new User()
        // some setters omitted

        o.optJSONArray("languages")?.each { String lang ->
            user.addToLanguages(lang.toLowerCase())
        }
        if (!user.languages) {
            user.addToLanguages(DEFAULT_LANGUAGE)
        }

        //user.save(failOnError: true)
        user.save(failOnError: true, flush: true)
    }
}
我想知道为什么会这样。在这两种情况下,日志中都没有错误

谢谢


编辑:Grails版本2.4.3

对remoteService.getUsers的调用是否返回任何数据?从代码上看,一切正常。是的,数据正常。有没有可能o为空?您可能会得到一个空指针异常。我看不出代码有任何错误,我有类似的代码,工作很好。我可能必须尝试创建一个可复制的测试用例,因为我也找不到代码有任何错误。