确定域对象是否持久化

时间:2015-04-14 11:01:53

标签: grails gorm

如何确定域类实例是否是持久的,即是从数据库加载的?我正在寻找一个可以为此对象返回false的属性/方法

def book = new Book(name: 'foo')

但是会为此对象返回true

def book = Book.findByName('foo')

检查真实的id属性是否可靠,例如

boolean isPersistent = book.id

1 个答案:

答案 0 :(得分:1)

使用isAttached方法或其attached属性表单:

def book = new Book(name: 'foo')
assert !book.attached

book.save(flush: true)

Book.withSession { it.clear() }
book = Book.findByName('foo')
assert book.attached

如果您不使用已分配的ID,则检查实例是否具有非空id将起作用,但并不总是正确的,因为您始终可以将长值分配给id属性非持久性实例(保存时会更新)。

请注意,对于与Hibernate会话分离的持久化实例,使用isAttached将失败 - 如果两者都是持久性的(即它是从数据库数据中实例化的)并且当前与会话相关联,则它只是true