С JEE 5 / EJB 3.0 жизнь Java-разработчиков стала намного проще. Позже, под влиянием Spring и CDI, аналогичные подходы были приняты и в JEE. Теперь я надеюсь, что делаю это правильно, но просто для уверенности: у меня есть несколько компонентов EJB без сохранения состояния, которые запрашивают и/или модифицируют базу данных. Примером является
@Stateless
public class AddressDBService {
@PersistenceContext
protected EntityManager em;
Некоторые компоненты EJB без сохранения состояния ссылаются на другие службы следующим образом:
@Stateless
public class AVeDBService {
@PersistenceContext
protected EntityManager em;
@Inject
private HomeToDealDBService homeToDealDBService;
@Inject
private AddressDBService addressDBservice;
а в EJB без сохранения состояния у меня есть общедоступные методы, подобные приведенным ниже:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void saveEntity(Home home) throws EntityExistsException {
this.em.persist(home);
addressDBservice.saveAddress(home.getMainAddress(), home);
}
Хотя я почти уверен, что это использование является правильным и потокобезопасным (вышеупомянутые сервисы, в свою очередь, внедряются в управляемые компоненты JSF). Может ли кто-нибудь подтвердить, что мое использование является правильным, потокобезопасным и соответствует передовой практике?
Мое использование, кажется, соответствует следующим вопросам:
Является ли EntityManager действительно потокобезопасным?
EJB без сохранения состояния с большим количеством внедренных экземпляров EJB