2014-10-28 2 views
0

Я учусь EJB/JPA, и я удивляюсь, как следует этот фрагмент работы:Как несинхронизированный EntityManager читает из БД?

@Stateful 
public class Sample { 
    @PersistenceContext(type=PersistenceContextType.EXTENDED, 
         synchronization=SynchronizationType.UNSYNCHRONIZED, 
         unitName="..") 
    EntityManager em; 

    public Employee get(int id){ 
     retirm em.find(Employee.class , id);  
    } 

    // ... 
} 

Это сохраняющий состояние фасоли, поэтому по умолчанию он должен быть заключен в контейнер менеджер сделки (обязательно).

Но, с другой стороны, несинхронизированный менеджер, как говорят, НЕ присоединяется к транзакции, независимо от того, что явно не связано.

Итак, если он не присоединяется к tx, как он извлекает данные из БД? Возможно ли, что он будет содержать грязные/фантомные чтения и т. Д.?

Этот фрагмент выполнен из «Pro JPA 2».

ответ

2

Из 3.1.1 из JPA 2.1 спецификации:

find метод (при условии, что вызывается без замка или вызывается с LockModeType.NONE) и метод getReference не требуется, чтобы быть вызван в рамках транзакции , Если используется администратор сущности со контекстом постоянства транзакций, результирующие объекты будут отсоединены; если используется менеджер объектов с расширенным контекстом персистентности, они будут управляться.

+0

Прохладный, спасибо! Но каков уровень изоляции для такой транзакции без чтения? –