Pregunta

Esta es una pregunta bastante para principiantes; sepa que soy consciente de ello.

Tengo un bean de sesión sin estado que necesita cargar algunos datos una vez y almacenarlos en caché localmente en una variable estática para que los utilicen todas las instancias de ese bean.Se puede acceder a los datos a través de un bean de entidad.Me pregunto si es seguro almacenar en caché la instancia de la entidad o si debería clonarla.Además, esta entidad también tiene subentidades.

Llame a la entidad Foo.Un Foo tiene un bar.En mi bean de sesión, me gustaría hacer algo como esto:

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
}

Mis preguntas:

  1. ¿Es una mala idea?¿Funcionará siquiera?

  2. ¿Existe una mejor manera de cargar los datos de Foo una vez, posiblemente sin necesidad de ese método getFoo()?Hacerlo estáticamente cuando la clase Session está cargada parecería ideal.

Nuevo código de muestra (preciso), según comentarios:

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);
    }
}
¿Fue útil?

Solución

Los campos estáticos no finales no están permitidos en Stateless Session Beans (SLSB).De la especificación EJB3, sección 21.1.2:

Un Enterprise Bean no debe utilizar campos estáticos de lectura/escritura.Se permite el uso de campos estáticos de solo lectura.Por lo tanto, se recomienda que todos los campos estáticos de la clase Enterprise Bean se declaren como finales.

Esta regla existe para garantizar la coherencia al distribuir instancias entre varias JVM.

Así que no es realmente una buena idea.Mi sugerencia sería confiar en el caché de segundo nivel que su proveedor JPA pueda admitir y dejarle manejarlo de forma transparente.

Como nota al margen, yo en realidad Me pregunto por qué tienes esta línea en tu bean:

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

En un entorno administrado, debe utilizar un gestionado por contenedores administrador de entidad e inyéctelo en su SLSB (usando el @PersistenceContext anotación).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top