Frage

Dies ist eine ziemlich neue Frage. Bitte seien Sie sich darüber im Klaren.

Ich habe eine zustandslose Session-Bean, die einige Daten einmal laden und lokal in einer statischen Variablen zwischenspeichern muss, damit sie von allen Instanzen dieser Bean verwendet werden kann.Auf die Daten kann über eine Entity-Bean zugegriffen werden.Ich frage mich, ob es sicher ist, die Entitätsinstanz zwischenzuspeichern, oder ob ich sie klonen sollte.Außerdem hat diese Entität auch Unterentitäten.

Nennen Sie die Entität Foo.Ein Foo hat eine Bar.In meiner Session-Bean würde ich gerne so etwas machen:

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
}

Meine Fragen:

  1. Ist das eine schlechte Idee?Wird es überhaupt funktionieren?

  2. Gibt es eine bessere Möglichkeit, die Foo-Daten einmal zu laden, möglicherweise ohne die Methode getFoo()?Es scheint ideal zu sein, dies statisch zu tun, wenn die Session-Klasse geladen ist.

Neuer (genauer) Beispielcode, pro Kommentar:

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);
    }
}
War es hilfreich?

Lösung

Nicht endgültige statische Felder sind in Stateless Session Beans (SLSB) nicht zulässig.Aus der EJB3-Spezifikation, Abschnitt 21.1.2:

Eine Enterprise-Bean darf keine statischen Lese-/Schreibfelder verwenden.Die Verwendung schreibgeschützter statischer Felder ist zulässig.Daher wird empfohlen, alle statischen Felder in der Enterprise-Bean-Klasse als endgültig zu deklarieren.

Diese Regel dient dazu, die Konsistenz bei der Verteilung von Instanzen auf mehrere JVMs sicherzustellen.

Also keine wirklich gute Idee.Mein Vorschlag wäre, sich auf den Second-Level-Cache zu verlassen, den Ihr JPA-Anbieter möglicherweise unterstützt, und ihn dies transparent handhaben zu lassen.

Als Randbemerkung: Ich Wirklich Ich frage mich, warum Sie diese Zeile in Ihrer Bean haben:

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

In einer verwalteten Umgebung sollten Sie a verwenden Container-verwaltet Entity Manager und fügen Sie es in Ihren SLSB ein (mithilfe von @PersistenceContext Anmerkung).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top