一个Grails 2.3.4
应用程序连接到Oracle数据库使用以下域类:Grails何时将一个ID分配给一个对象?
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) { ... }
我已经发现的是,的personInstance
的id
属性(其通过上述的方法调用传递)被分配时调用UtilService
。
调用PersonService
的控制器操作是@Transactional
,并且服务没有任何事务配置。
所以,几个问题:
- 当
id
值由GORM分配(我猜的插入,但看上去是错的)? - 有没有更好的方法来检查对象是否是新的(
isAttached()
返回true
这样对我不好)?
编辑:save()
尚未呼吁personInstance
时UtilService
做的id
检查。
我不是你的问题是什么完全清楚:你期待的ID仍在调用'save()'后为空或即使在保存后ID仍为空?否则在你的情况下(使用序列发生器)我会说,只要你的保存被刷新,这个ID就会被填充 - 如果你想急于你可以调用'save(flush:true)'。 – 2014-12-05 06:44:46
否则,也许是由于糟糕的经验,但我不会依赖GORM内部来查看某个对象是否刚刚被保存。你可以在'save()'后面设置的域类上使用'transient Boolean newlyInserted'属性,将实例包装成一个POGO或命令对象(它将包含一个'newInstance'属性),或者只需要一个您的服务方法的额外参数。 – 2014-12-05 06:48:32
@GregorPetrin,'id'在我调用'save()'之前有一个值,因此我的困惑。 – zoran119 2014-12-06 10:01:46