0

我有一个休眠对象,我正在使用 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;
    }
}
4

2 回答 2

1

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

于 2012-05-23T15:14:12.670 回答
0

问题是对象保存在当前的数据库事务中。这就是其他事务(或会话)尚不可见的内容。

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

您可以在事务结束时将其持久化,并使用detach reattach模式。或者您进行部分保存,即保存未完全完成的对象。你可以以某种方式标记它。

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

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

于 2012-05-23T15:20:12.157 回答