이것은 꽤 초보자 질문입니다. 제가 알고 있다는 것을 알고 계십시오.세션 종료 후 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
}
내 질문 :
이 나쁜 생각을? 그것도 작동할까요?
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
기본적으로 내 질문은 어떻게 FooHelper의 생성자의 주석 부분을 달성하는 것입니다. – jph
@ user190758 내 대답은 여전히 적용됩니다. JPA 공급자의 두 번째 레벨 캐시 기능을 사용하여'Foo' 엔티티 *를 투명하게 캐시합니다. 그것이 방법입니다. –