gpt4 book ai didi

jakarta-ee - 如何跨多个请求(使用 Wicket 和 JPA)将实体(或其关联)附加到当前持久性上下文?

转载 作者:行者123 更新时间:2023-12-02 00:50:18 24 4
gpt4 key购买 nike

我正在 Java EE 上开发基于 Wicket 的 Web 应用程序。

我正在尝试找到一种方法来确保在 Wicket 尝试渲染任何组件之前,用作模型对象的任何实体始终附加到当前的 EntityManager。这样,当组件从模型中获取数据时,实体可以根据需要延迟加载数据。

那里有很多教程,这里还有一些帖子,提到 LoadableDetachableModels (LDM) 作为解决方案。当我们不需要在请求之间保留任何状态时,这对我们有用。在这些情况下,每当呈现页面时,LDM 都会从数据库加载所需实体的最新版本。

但是,有时用户需要在保存数据之前通过多个步骤以有状态形式编辑数据,因此模型需要将实体保留在“未保存”状态。 LDM 将有效地清除用户在每一步所做的更改。

到目前为止,我们一直在使用一种在需要时将实体与持久性上下文合并的模型。这是一个简化版本:

public final class DetachableMergingModel<E extends Identifiable> implements IModel<E> {

private E entity;
private boolean attached = false;

public DetachableMergingModel(E entity) {
this.entity = entity;
}

@Override
public E getObject() {
if (!attached) {
attached = true;
// Non-transactional method merges entity with persistence context
// but does not flush any data to database
entity = getRepository().merge(entity);
}
}
return entity;
}

@Override
public void setObject(E entity) {
this.entity = entity;
}

@Override
public void detach() {
// This ensures that the next call to getObject() will merge the entity with
// the persistence context
attached = false;
}
/* ... */
}

我们的 EntityManager 是由 GlassFish 注入(inject)的,它跨越整个 servlet 请求,因此当实体附加到持久性上下文时,它将保持附加状态,直到页面呈现之后。

上面的模型处理实体已经被持久化并且刚刚被编辑的情况。每当页面上的组件调用此模型上的 getObject() 时,模型都会将实体与持久化上下文合并,这样我们就可以自由地导航实体的整个对象图,而不会抛出任何 LazyInitializationExceptions。

但是,在实体是新的且尚未持久化的情况下,我们无法使用此模型,因为实体尚未准备好合并。当用户创建新实体并且仍然需要通过表单填充值时,通常会出现这种情况。在这种情况下,我们希望拥有相同的自由度来导航实体的对象图(因为已经设置了一些关联,例如实体的父级),而不必担心出现 LazyInitializationException。

描述了类似的解决方案here (选项#3),但它不涵盖上述“新实体”用例。

有人遇到过这个用例吗?你是怎么解决的?有没有比通过自定义 IModel 实现更好的方法将 Wicket 与 JPA 集成?

最佳答案

在这种情况下,我通常会创建一个 DTO 来保存创建实体所需的所有数据。如果您需要引用现有实体 - 将它们作为单独的模型传递到您的表单/面板。提交表单后,您可以:

  • 执行验证
  • 从已编辑的 DTO 创建新实体
  • 注入(inject)对您存储在这些单独的 LDM 模型中的其他实体的引用。
  • 保留实体。

虽然有点麻烦,但确实有效。

跨越多个请求的对话在纯 wicket 中不可用,并且可能永远不会 - 这不是 wicket 的区域。

Seam 支持长时间对话,并且支持 wicket(我从未使用过 Seam - 我无法在这方面向您提供建议)。

关于jakarta-ee - 如何跨多个请求(使用 Wicket 和 JPA)将实体(或其关联)附加到当前持久性上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7070644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com