문제

이것은 예쁜 초보자의 질문입니다 - 제가 알고 있습니다.

나는 일부 데이터를 한 번로드하고 해당 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
}
.

내 질문 :

  1. 이것은 나쁜 생각입니까?조차도 일할 것인가?

  2. 는 Foo 데이터를 한 번로드 할 수있는 더 좋은 방법이 있으며, 그게 getFoo () 메소드가 필요하지 않아도됩니다.세션 클래스가로드 될 때 정적으로 수행하면 이상적인 것 같습니다.

  3. 새로운 (정확한) 샘플 코드, 댓글 당 :

    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 주석 사용).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top