我对 Grails 中的 withSession 和当前的休眠会话感到困惑。
我的问题是:我们在闭包中访问的会话对象是否与当前的休眠会话对象相同?
我编写了一个具有如下操作的服务:
def strangeBehavior(){
Link.withSession { session->
println "link current session " + session.hashCode()
}
Task.withSession { session->
println "task current session " + session.hashCode()
}
Project.withSession { session->
println "project current session " + session.hashCode()
}
UserStory.withSession { session->
println "user story current session " + session.hashCode()
}
def ctx = AH.application.mainContext
def sessionFactory = ctx.sessionFactory
def tmp = sessionFactory.currentSession
println " current session " + tmp.hashCode()
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说奇怪的是,有 5 个不同的哈希码...如果我打印 5 …
我在grails doc中看到了一些关于join fetch的内容:
"这适用于单端关联,但你需要小心一对一.查询将按照你期望的那样工作,直到你想要的结果数量限制为止.你可能会得到比你预期的结果更少的结果.原因很简单,但最终问题出现在使用左外连接的GORM上."
我不明白为什么左外连接可以在无单端关联中引发问题,例如一对多.
能给我举个例子 ?
如果我采取约书亚给出的例子
Class Person {
String name
static hasMany = [numbers:PhoneNumber]
static mapping = {
nubmers fetch : 'join'
}
}
Class PhoneNumber{
static belongsTo = [owner : Person]
}
//for testing
def person = Person.get(1)
result in:
select name,... from
person left outer join phone_number
on person.id = phone_number.owner_id
where person.id=1;
Run Code Online (Sandbox Code Playgroud)
你能给我一个查询(在gorm中)可以告诉我这个问题吗?
谢谢
假设我有一个具有签名的方法
def myAction(objet,String propertyName);
我只是想从objet中检索属性值,我写了两个版本
版本1:我构造了getter方法并在objet上调用它
original = propertyName
prefix = original.substring(0,1).toUpperCase()
suffix = original.substring(1,original.length())
methodName = new StringBuilder('get').append(prefix).append(suffix).toString()
value = domain.metaClass.invokeMethod(objet,methodName,null)
Run Code Online (Sandbox Code Playgroud)
版本2:我直接使用GroovyObject提供的getProperty方法
value = objet.getProperty(propertyName)
Run Code Online (Sandbox Code Playgroud)
巫婆一个有更好的表现?
想 : )