Grails 2.3.4
应用程序使用以下域类连接到Oracle数据库:
class Person {
String name
static mapping = {
id column: "PERSON_ID", generator: "sequence", params: [sequence: 'person_seq']
}
}
PersonController
调用PersonService
中的方法,并调用UtilService
。调用UtilService
中的方法有一些逻辑基于此Person
对象是新的:
if (personInstance.id == null) { ... }
我发现在调用id
时会分配personInstance
的{{1}}属性(通过上述方法调用传递)。
调用UtilService
的控制器操作是PersonService
,并且服务没有任何事务配置。
所以,有几个问题:
@Transactional
值是什么时候(我假设插入但似乎错了)?id
返回isAttached()
,这样对我不利)?编辑:当true
进行save()
检查时,personInstance
尚未调用UtilService
。
答案 0 :(得分:1)
致电save()
时会分配ID。对于大多数持久性调用,Hibernate会延迟刷新更改,直到感觉必须刷新为止,以确保正确性。但save()
来电被区别对待。我相信动机是即使我们知道最终会调用flush(),即使它在请求的最后,我们也希望尽早检索id,这样它就不会突然改变
请注意,该服务没有任何交易配置"是事务性的 - 获取非事务性服务的唯一方法是删除所有@Transactional
注释(较新的Grails注释和较旧的Spring注释)并添加
static transactional = false
所有其他服务都是交易性的,但您可以配置忽略的个别方法## Headin。
答案 1 :(得分:0)
事实证明,我有一个findBy
正在刷新会话:
utilService.someMethod(Person.findByUsername(username))
此时id
已填充。
使用withNewTransaction
:
def personInstance = Person.withNewSession { Person.findByUsername(username) }
utilService.someMethod(personInstance)
现在引导我进入next question ......