2010-07-09 4 views
1

이것은 꽤 초보자 질문입니다. 제가 알고 있다는 것을 알고 계십시오.세션 종료 후 Entity Bean에 대한 참조를 저장하는 것이 안전합니까?

나는 한 번 데이터를로드하고 그 빈의 모든 인스턴스가 사용할 정적 변수에 로컬로 캐시해야하는 스테이트리스 세션 빈을 가지고있다. 엔티티 bean을 통해 데이터에 액세스 할 수 있습니다. 엔티티 인스턴스를 캐시하는 것이 안전한지 아니면 복제해야하는지 궁금합니다. 또한이 엔티티에는 하위 엔티티도 있습니다.

엔티티 Foo를 호출하십시오. Foo에는 Bar가 있습니다. 내 세션 빈에서 나는 같은 것을 할 싶습니다

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

비 최종 정적 필드는 무 상태 세션 빈 (SLSB)에서 허용되지 않습니다. EJB3 명세, 섹션 21.1.2 :

엔터프라이즈 빈은 읽기/쓰기 정적 필드를 사용하지 않아야합니다. 읽기 전용 정적 필드 사용은 허용됩니다. 따라서 엔터프라이즈 Bean 클래스의 모든 정적 필드를 final로 선언하는 것이 좋습니다.

이 규칙은 여러 JVM에 인스턴스를 배포 할 때 일관성을 보장하기위한 것입니다.

정말 좋은 생각이 아닙니다. 내 제안은 JPA 제공 업체가 지원할 수있는 2 차 수준 캐시에 의존하여 투명하게 처리하도록하는 것입니다. 당신이 당신의 콩 라인 왜 보조 노트로

, 정말 궁금해 : 관리되는 환경에서

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

을, 당신은 컨테이너 관리 엔티티 관리자를 사용하고 주입 받아야 SLSB에서 (@PersistenceContext 주석 사용).

+0

내 견본 코드는 내가하려는 것을 정확하게 반영하지 않습니다. 원래 샘플에 새 샘플을 추가합니다. – jph

+0

기본적으로 내 질문은 어떻게 FooHelper의 생성자의 주석 부분을 달성하는 것입니다. – jph

+0

@ user190758 내 대답은 여전히 ​​적용됩니다. JPA 공급자의 두 번째 레벨 캐시 기능을 사용하여'Foo' 엔티티 *를 투명하게 캐시합니다. 그것이 방법입니다. –

관련 문제