#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