【问题标题】:When does Grails assign an ID to an object?Grails 何时为对象分配 ID?
【发布时间】:2015-02-03 05:31:16
【问题描述】:

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) { ... }

我发现personInstanceid 属性(通过上述方法调用传递)是在调用UtilService 时分配的。

调用PersonService的控制器动作是@Transactional,服务没有任何事务配置。

所以,有几个问题:

  • GORM 何时分配 id 值(我在插入时假设但似乎错误)?
  • 有没有更好的方法来检查对象是否是新的(isAttached() 返回true,所以这对我不利)?

编辑:当UtilService 执行id 检查时,personInstance 上没有调用save()

【问题讨论】:

  • 我不完全清楚您的问题是什么:您是否希望在调用 save() 后 ID 仍然为空,或者即使保存后 ID 仍然为空?否则,在您的情况下(使用序列生成器),我会说一旦您的保存被刷新,ID 就会被填充 - 如果您想赶时间,您可以致电 save(flush:true)
  • 否则,可能由于体验不好,但我不会依赖 GORM 内部来查看对象是否刚刚保存。您可以在save() 之后设置的域类上使用transient Boolean newlyInserted 属性,将实例包装到 POGO 或命令对象(其中将包含例如newInstance 属性),或者只是在您的服务方法。
  • @GregorPetrin,id 在我调用 save() 之前就有一个值,因此我很困惑。
  • 我明白了,这改变了一些事情......你可以尝试一些简单的旧 println 调试来查看实例何时真正被保存:在你的域类中创建一个方法 def beforeInsert() { println "Saving Person object!" } 和其他 println代码中的语句。
  • 这是一个findBy,它正在刷新会话,这个刷新正在填充id(据我所知,发布了一个描述我如何处理它的答案)

标签: oracle hibernate grails grails-orm


【解决方案1】:

当您调用save() 时分配ID。对于大多数持久性调用,Hibernate 会延迟刷新更改,直到感觉必须刷新)以确保正确性。但是save() 调用的处理方式不同。我相信动机是即使我们知道flush()最终会被调用,即使它在请求的最后,我们也希望尽早检索id,这样它就不会突然改变。

请注意,“没有任何事务配置”的服务是事务性的 - 获得非事务性服务的唯一方法是删除所有 @Transactional 注释(较新的 Grails 注释和较旧的 Spring 注释)并添加

static transactional = false

所有其他服务都是事务性的,尽管您可以将个别方法配置为忽略## Headin。

【讨论】:

  • 我忘了提到当id 签入UtilService 时,我没有在personInstance 上调用save()。因此我的困惑。这几乎就像调用UtilService 刷新休眠会话...
  • 这是一个findBy,它正在刷新会话,这个刷新正在填充id(据我所知,发布了一个描述我如何处理它的答案)
【解决方案2】:

原来,我有一个 findBy 正在刷新会话:

utilService.someMethod(Person.findByUsername(username))

此时id 被填充。

使用withNewTransaction 解决了这个问题:

def personInstance = Person.withNewSession { Person.findByUsername(username) }
utilService.someMethod(personInstance)

现在引导我进入next question...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多