세션이 끝나면 엔티티 bean에 대한 참조를 저장하는 것이 안전합니까?
-
13-09-2020 - |
문제
이것은 예쁜 초보자의 질문입니다 - 제가 알고 있습니다.
나는 일부 데이터를 한 번로드하고 해당 bean의 모든 인스턴스에서 사용하기 위해 정적 변수에 로컬로 캐시 해야하는 상태 비 저장 세션 bean을 가지고 있습니다.데이터는 엔티티 빈을 통해 액세스 할 수 있습니다.엔티티 인스턴스를 캐시하거나 복제 해야하는 경우 안전한 경우 궁금합니다.또한이 엔터티에는 하위 엔티티가 있습니다.
엔티티 foo를 호출하십시오.Foo에는 막대가 있습니다.내 세션 콩에서, 이렇게하고 싶습니다 :
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 () 메소드가 필요하지 않아도됩니다.세션 클래스가로드 될 때 정적으로 수행하면 이상적인 것 같습니다.
새로운 (정확한) 샘플 코드, 댓글 당 :
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);
}
}
.해결책
최종 정적 필드는 stateeless 세션 beans (SLSB)에서는 허용되지 않습니다.EJB3 사양에서 21.1.2 절 :
엔터프라이즈 빈은 읽기 / 쓰기 정적 필드를 사용하지 않아야합니다.읽기 전용 정적 필드를 사용하면 허용됩니다.따라서 Enterprise Bean 클래스의 모든 정적 필드를 최종으로 선언하는 것이 좋습니다.
이 규칙은 여러 JVM에서 인스턴스를 배포 할 때 일관성을 보장하기 위해 있습니다.
정말 좋은 생각이 아닙니다.내 제안은 JPA 제공 업체가 투명하게 처리 할 수있는 두 번째 레벨 캐시에 의존하는 것입니다.
측면 메모로, 나는 정말 이란 왜이 줄을 당신의 bean에 가지고 있는지 궁금합니다.
EntityManager em = Container.getInstance().getEntityManager();
.
관리되는 환경에서는 컨테이너 관리 엔티티 관리자를 사용하여 SLSB에 주입됩니다 (@PersistenceContext
주석 사용).