2010-07-09 26 views
1

這是一個相當新手的問題 - 請知道我知道這一點。在會話結束後安全地存儲對實體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 
} 

我的問題:

  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); 
    } 
} 

回答

2

非最終靜態字段中無狀態會話Bean(SLSB)是不允許的。根據EJB3規範,第21.1.2節:

企業bean不得使用讀/寫靜態字段。允許使用只讀靜態字段。因此,建議將企業bean類中的所有靜態字段聲明爲final。

此規則用於確保在跨多個JVM分發實例時的一致性。

所以不是一個好主意。我的建議是依靠JPA提供商可能支持的二級緩存,並讓他透明處理。

作爲一個方面說明,我真的難怪爲什麼你有這樣的線在你的bean:

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

在託管環境中,你應該使用容器管理實體管理器,並把它注入在您的SLSB中(使用@PersistenceContext註釋)。

+0

回想起來,我的示例代碼並不能準確地反映出我想要做的事情。將新的樣本添加到原始文章。 – jph 2010-07-09 18:46:28

+0

基本上我的問題是如何完成FooHelper的構造函數的註釋部分。 – jph 2010-07-09 18:53:20

+0

@ user190758我的答案仍然適用:使用JPA提供程序的二級緩存功能爲您透明地緩存'Foo'實體*。這是要走的路。 – 2010-07-09 20:07:17