Безопасно для хранения ссылки на боб Entity после заканчивается сессия?

StackOverflow https://stackoverflow.com/questions/3214711

Вопрос

Это симпатичный вопрос новичка - пожалуйста, знайте, что я знаю об этом.

У меня есть фасоль сеанса без вождения, который должен загрузить некоторые данные один раз и кэшировать его локально в статической переменной для использования всеми экземплярами этого компонента.Данные могут быть доступны через Bean Entity.Мне интересно, если его безопасно кэшировать экземпляр объекта или, если я должен клонировать его.Также эта сущность также имеет субъекты.

Вызовите объект 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. Есть ли лучший способ загрузить данные FO, возможно, без необходимости для этого метода 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);
        }
    }
    
    .

Это было полезно?

Решение

Некончащие статические поля не допускаются в бобовых бобах без оказания бездействия (SLSB).Из спецификации EJB3, раздел 21.1.2:

Предполагается, что корпоративный боб не должен использовать статические поля чтения / записи.Разрешена статические поля только для чтения.Поэтому рекомендуется объявить все статические поля в классе предприятий BEAL BEAT.

Это правило для обеспечения согласованности при распределении экземпляров по нескольким JVMS.

Так что не очень хорошая идея.Мое предложение было бы полагаться на кэш второго уровня, который может поддерживать ваш провайдер JPA и позволит ему справиться с этим прозрачно.

как боковая заметка, я действительно удивляешься, почему у вас есть эта строка в вашем бобовом бобовом:

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

В управляемой среде вы должны использовать управленческий менеджер EM> Container, управляемый контейнерами и вводили его в ваш SLSB (с помощью аннотации @PersistenceContext).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top