JSF и синхронизированная загрузка из EntityManager

#jpa #jsf #entitymanager

Вопрос:

Я знаю, что EntityManager не является потокобезопасным, но как с этим работать в JSF?

Среда: Tomcat с Java-SE. Не весна или что-то в этом роде. Ручное управление транзакциями.

Если у меня есть такой объект, как (псевдокод):

 @Entity
class Person {
  @OneToMany(lazy=true)
  List<Address> addresses;

  @ManyToOne(lazy=true)
  Company company;
}
 

Тогда у меня есть имя, похожее на

 @Named
@SessionScoped
class PersonBean {
  EntityManager entityManager;

  public PersonBean(EntityManager em) { this.entityManager = em; }

  public Person getPerson() {
    em.find(Person.class, 1);  // load the Person with id=1
  }
}
 

И страница, подобная

 <html>
<body>
  #{personBean.person.addresses[0].street}<br/>
  #{personBean.person.addresses[0].number}<br/>
  #{personBean.person.addresses[0].city}<br/>

  #{personBean.person.company.address.street}<br/>
</body>
</html>
 

В этой ситуации я могу сделать em.find() это синхронизированным способом, чтобы продолжать использовать EntityManager потокобезопасным способом. Но как насчет самой страницы? Я предполагаю, что JSF будет загружать значения параллельно?

Есть какие-нибудь предложения? Или нет никаких проблем?

Большое вам спасибо за любые советы.

Комментарии:

1. Потокобезопасность не является проблемой, потому что вы получаете выделенный объект для каждой транзакции. Проблема в ленивой загрузке. Контекст перстенции EntityManger будет закрыт, когда вы получите доступ к коллекции адресов JSF. Какой сервер приложений вы используете?

2. Я использую Java-SE с Tomcat. Таким образом, полностью ручное управление транзакциями. Поэтому я создаю EntityManager для компонента, который живет во время сеанса. Человек остается «управляемым», и при ленивой загрузке у него будет EntityManager