gpt4 book ai didi

java - session 结束后可以安全地存储对实体 Bean 的引用吗?

转载 作者:行者123 更新时间:2023-11-30 05:11:32 25 4
gpt4 key购买 nike

这是一个相当新手的问题 - 请知道我知道这一点。

我有一个无状态 session bean,需要加载一些数据一次并将其缓存在本地静态变量中以供该 bean 的所有实例使用。可以通过实体 bean 访问数据。我想知道缓存实体实例是否安全,或者我是否应该克隆它。此外,该实体还有子实体。

将实体命名为 Foo。 A Foo 有一个 Bar。在我的 session bean 中,我想做这样的事情:

private static final FOO_ID = 123L;

private static Foo foo;

private static Foo getFoo(EntityManager em) {
if (foo != null)
return foo;
return foo = (Foo) em.find(Foo.class, FOO_ID);
}

public void someBusinessMethod() {
EntityManager em = Container.getInstance().getEntityManager();
Foo foo = getFoo(em);
Bar bar = foo.getBar();
// do some stuff with foo and bar
}

我的问题:

  1. 这是一个坏主意吗?它还能工作吗?

  2. 是否有更好的方法来加载 Foo 数据一次,可能不需要 getFoo() 方法?在加载 Session 类时静态执行此操作似乎是理想的选择。

新的(准确的)示例代码,根据评论:

public class Foo {   // entity
private Long id;
private String name;
// getters and setters
}

public class Bar { // entity
private Long id;
private String name;
// getters and setters
}

public class FooHelper implements Helper {
private static final long FOO_ID = 123L;
private Foo foo;
public FooHelper() {
// use FOO_ID to look up a Foo & cache it locally
}
@Override
public void addBar(EntityManager em) {
Bar bar = new Bar();
bar.setName(foo.getName());
em.persist(bar);
}

public class StatelesSessionBean {
private static final Helper helper = new FooHelper();
public void someBusinessMethod() {
@PersistenceContext
EntityManager em;
helper.addBar(em);
}
}

最佳答案

无状态 session Bean (SLSB) 中不允许使用非最终静态字段。来自 EJB3 规范,第 21.1.2 节:

An enterprise bean must not use read/write static fields. Using read-only static fields is allowed. Therefore, it is recommended that all static fields in the enterprise bean class be declared as final.

此规则是为了确保跨多个 JVM 分配实例时的一致性。

所以这并不是一个好主意。我的建议是依赖您的 JPA 提供商可能支持的二级缓存,并让他透明地处理该问题。

顺便说一句,我真的想知道为什么你的 bean 中有这一行:

EntityManager em = Container.getInstance().getEntityManager();

在托管环境中,您应该使用容器管理的实体管理器并将其注入(inject)到 SLSB 中(使用 @PersistenceContext 注释)。

关于java - session 结束后可以安全地存储对实体 Bean 的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3214711/

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