這是一個相當新手的問題 - 請知道我知道這一點。在會話結束後安全地存儲對實體Bean的引用?
我有一個無狀態的會話bean,需要加載一次數據並將其緩存在一個靜態變量的本地,供該bean的所有實例使用。數據可以通過實體bean訪問。我想知道它是否安全地緩存實體實例,或者我應該克隆它。而且,這個實體也有子實體。
調用實體Foo。一個Foo有一個酒吧。在我的會話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
}
我的問題:
這是一個壞主意?它會工作嗎?
有沒有更好的方法來加載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);
}
}
回想起來,我的示例代碼並不能準確地反映出我想要做的事情。將新的樣本添加到原始文章。 – jph 2010-07-09 18:46:28
基本上我的問題是如何完成FooHelper的構造函數的註釋部分。 – jph 2010-07-09 18:53:20
@ user190758我的答案仍然適用:使用JPA提供程序的二級緩存功能爲您透明地緩存'Foo'實體*。這是要走的路。 – 2010-07-09 20:07:17