oracle - Grails何时向对象分配ID?

标签 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中的方法,并调用UtilServiceUtilService对象中的方法基于新的Person对象具有一些逻辑:
if (personInstance.id == null) { ... }

我发现,调用id时,分配了personInstanceUtilService属性(通过上述方法调用传递)。

调用PersonService的 Controller 操作是@Transactional,并且服务没有任何事务配置。

因此,有两个问题:
  • GORM何时分配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/

    相关文章:

    java - Persistence.createEntityManagerFactory ("something")返回 null

    grails - 对访问域对象Grails的属性感到困惑

    servlets - web.xml中没有GrailsDispatcherServlet的映射

    mysql - 复制关系表数据

    sql - 如何显示不存在的记录?

    sql - 考虑到动态查询的索引大平面表的最佳方式

    java - 如何将现有对象合并为新实体中的 @OneToMany 关系?

    MySQL锁等待超时和死锁错误

    sql - 列表查询 "ORA-00937: not a single-group group function"

    oracle - 如何使用联接和聚合快速刷新物化 View ?