当以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