سؤال

هذا سؤال مبتدئ جدًا - يرجى العلم أنني على علم بذلك.

لدي حبة جلسة عديمة الحالة تحتاج إلى تحميل بعض البيانات مرة واحدة وتخزينها مؤقتًا محليًا في متغير ثابت لاستخدامها من قبل جميع مثيلات تلك الحبة.يمكن الوصول إلى البيانات من خلال وحدة الكيان.أتساءل عما إذا كان من الآمن تخزين مثيل الكيان مؤقتًا، أو ما إذا كان ينبغي علي استنساخه.كما أن هذا الكيان لديه أيضًا كيانات فرعية.

اتصل بالكيان Foo.يحتوي A 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()؟قد يبدو القيام بذلك بشكل ثابت عند تحميل فئة الجلسة أمرًا مثاليًا.

نموذج كود جديد (دقيق) لكل تعليق:

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);
    }
}
هل كانت مفيدة؟

المحلول

لا يُسمح بالحقول الثابتة غير النهائية في وحدات الجلسة عديمة الحالة (SLSB).من مواصفات EJB3، القسم 21.1.2:

يجب ألا تستخدم وحدة برامج المؤسسة حقولًا ثابتة للقراءة/الكتابة.يُسمح باستخدام الحقول الثابتة للقراءة فقط.لذلك، يوصى بإعلان كافة الحقول الثابتة في فئة فول المؤسسة على أنها نهائية.

توجد هذه القاعدة لضمان الاتساق عند توزيع المثيلات عبر أجهزة JVM متعددة.

لذلك ليست حقا فكرة جيدة.اقتراحي هو الاعتماد على ذاكرة التخزين المؤقت من المستوى الثاني التي قد يدعمها موفر JPA الخاص بك والسماح له بالتعامل مع ذلك بشفافية.

كملاحظة جانبية، أنا حقًا أتساءل لماذا لديك هذا الخط في الفول الخاص بك:

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

في بيئة مُدارة، يجب عليك استخدام إدارة الحاويات مدير الكيان وإدخاله في SLSB الخاص بك (باستخدام ملف @PersistenceContext حاشية. ملاحظة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top