Grails什么时候为对象分配ID?

时间:2014-12-05 05:14:01

标签: oracle hibernate grails gorm

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,并且服务没有任何事务配置。

所以,有几个问题:

  • GORM分配的@Transactional值是什么时候(我假设插入但似乎错了)?
  • 有没有更好的方法来检查对象是否是新的(id返回isAttached(),这样对我不利)?

编辑:当true进行save()检查时,personInstance尚未调用UtilService

2 个答案:

答案 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 ......