【发布时间】: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) { ... }
我发现personInstance 的id 属性(通过上述方法调用传递)是在调用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