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
的UtilService
属性(通过上述方法调用传递)。调用
PersonService
的 Controller 操作是@Transactional
,并且服务没有任何事务配置。因此,有两个问题:
id
值(我假设是在插入时出现的,但这似乎是错误的)? isAttached()
返回true
,因此对我不利)? 编辑:当
save()
执行personInstance
检查时,尚未在UtilService
上调用id
。
最佳答案
调用save()
时会分配ID。对于大多数持久性调用,Hibernate会延迟刷新更改,直到感觉到必须刷新为止,以确保正确性。但是save()
调用的处理方式有所不同。我相信这样做的动机是,即使我们知道将最终调用flush(),即使它在请求的末尾,我们也要尽早检索id以便它不会突然改变。
请注意,“没有任何事务配置”的服务是事务性的-获得非事务性服务的唯一方法是删除所有@Transactional
注释(较新的Grails注释和较旧的Spring注释)并添加
static transactional = false
所有其他服务都是事务性的,尽管您可以将单个方法配置为忽略## Headin。
关于oracle - Grails何时向对象分配ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27309229/