hibernate - 如何解释使用Hibernate查询的这种行为?是由于Hibernate的懒惰吗?

标签 hibernate grails groovy gorm lazy-loading

今天早上,我遇到了一种我无法真正解释的行为:当尝试使用GORM保存(或检索是否已经存在)某些对象时,当一个对象(名称为“name3”)出现时,我对NullPointerException感到惊讶可以简单地从数据库中检索并存储在List中,然后再读取为null。使我惊讶的是,当我将此对象存储在def变量(或者我认为不是集合的任何东西)中时,异常消失了。

这是一个示例代码(顺便说一下,数据库开头是空的)

// A simple domain class : 
class MyDomainClass {
    String name
}


//In the PluginClass where i initialize some pieces of data : 
def doWithApplicationContext = { ctx ->

    MyDomainClass.withNewSession {

        def myDomainObjectsNames = ["name1","name2"]
        def myDomainObjectsList = []
        myDomainObjectsNames.each { name ->
            def myDomainObject = MyDomainClass.findByName(name) ?: new MyDomainClass(name: name).save(failOnError: true)
            myDomainObjectsList.add(myDomainObject)
        }
        myDomainObjectsList.each { println("object : " + it.toString())}

        myDomainObjectsNames = ["name3","name2"]
        myDomainObjectsList = []
        myDomainObjectsNames.each { name ->
            myDomainObjectsList << MyDomainClass.findByName(name) ?: new MyDomainClass(name: name).save(failOnError: true)
        }
        myDomainObjectsList.each { println("object : " + it.toString())}
    }
}

代码输出:
object : mypackage.MyDomainClass : 1
object : mypackage.MyDomainClass : 2
object : null // Can't explain
object : mypackage.MyDomainClass : 2

难道是由于休眠懒惰?还是Groovy动态类型?我不确定。
谢谢 !

最佳答案

它与局部变量无关,但与precendence of << vs ?: 有关。您的第二个循环首先将findBy的结果添加到列表中。

def list = []
list << null ?: 666
assert list.first()==null

关于hibernate - 如何解释使用Hibernate查询的这种行为?是由于Hibernate的懒惰吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28412032/

相关文章:

grails - 使用HTTPBuilder池化连接

validation - grails 数据绑定(bind)参数 a 在 b 上的映射

grails - 将分页选项应用于 Grails 中的一对多列表

java - 我如何使用 hibernate 生成迁移?

windows - 带有 Windows 斜线的 Grails 2.3.0 升级问题

java - Hibernate SQL 语法错误生成的查询

grails - Grails BuildConfig中的IntelliJ mavenLocal警告

grails - 使用findAllBy时返回唯一结果

java - Hibernate与sql server检索数据遇到意外的未知 token

hibernate - 常量作为 NamedQueries 中的参数是一个好习惯吗?