批量导入中的所有Grails域对象都不会保留Bag of Strings

时间:2014-09-16 07:32:06

标签: grails grails-2.0

当以JSON格式导入User域对象时,我遇到了一个奇怪的问题。 我们有一个导入器服务,它循环通过从外部服务导入的JSONArray。对于用户在JSON中没有任何languages的情况,服务逻辑具有后备 奇怪的是,如果JSON包含数百个对象,则只有前200个左右的用户在导入后才能正确地为其分配默认语言。 但是,如果我在每次迭代时使用user.save(flush: 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

0 个答案:

没有答案