在持久化到数据库之前,Hibernate通过id获取保存的对象

时间:2012-05-23 14:25:19

标签: java hibernate

我有一个hibernate对象,我坚持使用session.saveOrUpdate而不提交给我的对象id的数据库。我将对象id传递给我的接口,稍后将用于在提交时重建对象。当我提交表单时,我不再能够执行会话查询来检索对象,因为该对象在技术上不存在于数据库中。

有人知道如何检索该对象吗?如果我只是创建一个新对象,数据库ID将增加失控。有什么想法吗?

问题编辑和澄清。

当提交表单并包含错误时,我需要捕获错误并重新加载包含错误的页面。我遇到的问题是我丢失了我的集合中的非持久数据。我的解决方案是暂时将包含所有子对象的当前对象持久保存到用户会话,然后在重新加载页面后将持久对象复制回主对象,这将返回所有用户以前的数据。但是我遇到了懒得初始化角色集合的问题:这就是我使用session.update之类的事务的原因。这解决了这个问题,但在实际保存到数据库之前,在验证错误之前为新创建的对象提供了id。

代码示例

@Property
private PurchaseRequest pr;

@Persist
private PurchaseRequest prPersist;   

Class<?> onActivate(Long prId) {
    if(request.isXHR()) {
        return null;
    }

    PurchaseRequest purchaseRequest = null;

    if(prPersist != null) {           
        session.update(prPersist);
        purchaseRequest = prPersist;
        prPersist = null;
    } else {
        purchaseRequest = (PurchaseRequest) session.createCriteria(PurchaseRequest.class)
            .add(Restrictions.idEq(prId))
            .uniqueResult();
    }

    this.pr = purchaseRequest;
}

验证方法

void onValidateFromPR() throws Exception {
    if (form.getHasErrors()) {
        prPersist = this.pr;
        return Page.Index;
    }
}

2 个答案:

答案 0 :(得分:1)

如果您不希望将对象保存在数据库中,则没有理由saveOrUpdate对象并为其分配ID。只有在提交表单并且对象中包含的数据有效时才保存它。

答案 1 :(得分:0)

事情是该对象保存在当前的DB事务中。这是另一个交易(或会话)尚不可见的。

在提交当前对象之前,该对象不存在于另一个事务中。您可以与隔离级别一起玩,但我不推荐它。

您可以在交易结束时保留它,并使用detach reattach模式。或者您进行部分保存,保存未完全完成的对象。你可以标记它。

另一种方法是使用此类对象的内存存储。

每次调用saveOrUpdate或任何使对象持久化的方法都会告诉Hibernate你最终会保存它时,生成ID是合法的。