Question

C'est plutôt une question de newbie - s'il vous plaît sais que je suis conscient de cela.

J'ai un bean session sans état qui a besoin de charger des données une fois et les mettre en cache localement dans une variable statique pour une utilisation par toutes les instances de cette fève.Les données peuvent être accessibles par le biais d'un entity bean.Je me demandais si son coffre-fort à la cache de l'instance de l'entité, ou si je dois cloner.Aussi, cette entité a également des sous-entités.

Appeler l'entité Foo.Foo dispose d'un Bar.Au cours de ma session bean, j'aimerais faire quelque chose comme ceci:

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
}

Mes questions:

  1. Est-ce une mauvaise idée?Il va même travail?

  2. Est-il une meilleure façon de charger les Foo données une fois, peut-être sans le besoin pour que getFoo() la méthode?Faire statiquement lors de la Séance de classe est chargée semble être l'idéal.

Nouveau (précis) exemple de code, par des commentaires:

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);
    }
}
Était-ce utile?

La solution

Non final champs statiques ne sont pas autorisés dans les Beans de Session sans état (SLSB).À partir de la spécification EJB3, section 21.1.2:

Un haricot d'entreprise ne doit pas utiliser la lecture/écriture des champs statiques.À l'aide de lire uniquement les champs statiques est autorisé.Par conséquent, il est recommandé que tous les champs statiques dans l'entreprise bean classe déclarée final.

Cette règle est là pour s'assurer de la cohérence lors de la distribution sur plusieurs machines virtuelles.

Donc pas vraiment une bonne idée.Ma suggestion serait de s'appuyer sur le cache de second niveau que votre fournisseur JPA peut soutenir et de le laisser gérer que de manière transparente.

Comme une note de côté, je vraiment me demande pourquoi vous avez cette ligne dans votre bean:

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

Dans un environnement géré, vous devez utiliser un container-managed gestionnaire d'entité et d'obtenir injecté dans votre SLSB (à l'aide de la @PersistenceContext l'annotation).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top