Это довольно новый вопрос - пожалуйста, знайте, что я об этом знаю.
У меня есть сессионный компонент без сохранения состояния, который должен загрузить некоторые данные один раз и локально кэшировать их в статической переменной длявсе экземпляры этого боба.Доступ к данным можно получить через объектный компонент.Я задаюсь вопросом, безопасно ли кешировать экземпляр сущности или мне следует его клонировать.Кроме того, этот объект также имеет дочерние объекты.
Вызовите объект 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
}
Мои вопросы:
Это плохая идея?Будет ли это вообще работать?
Есть ли лучший способ загрузить данные Foo один раз, возможно, без необходимости использования метода getFoo ()?Делать это статически при загрузке класса Session казалось бы идеальным.
Новый (точный) пример кода, по комментариям:
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);
}
}