EntityManager и два DAO с PersistenceContextType.EXTENDED

У меня проблема с моим менеджером сущностей в моем приложении. У меня есть два класса DAO:

@Repository
public abstract class DaoA 
{
    protected ClassA persistentClass;

    @PersistenceContext(name="my.persistence", type=PersistenceContextType.EXTENDED)
    protected EntityManager entityManager;
    -------------- some typical action for DAO --------------
}

Второй DAO предназначен для класса B и похож на DaoA. Остальное за меня делает фреймворк Spring.

Когда я отлаживаю приложение, я узнаю, что оба объекта DAO имеют разные экземпляры EntityManager. В результате два моих разных DAO связаны с разными PersistenceContext.

Вопрос в том, правильное ли это поведение или нет? Я хотел бы иметь один и тот же PersistenceContext для всех моих классов DAO. Пожалуйста, дайте мне подсказку, возможно ли это, и правильно ли я понял JPA?

С уважением


person hsd    schedule 17.01.2011    source источник


Ответы (1)


Это правильное поведение EXTENDED контекста персистентности, поэтому в данном случае вам не нужно, чтобы он был EXTENDED.

В большинстве случаев вам нужен контекст персистентности TRANSACTIONAL, который является режимом по умолчанию, когда type опущен:

@PersistenceContext(name="my.persistence")
protected EntityManager entityManager;

В этом режиме контекст сохранения связан с транзакцией, поэтому все DAO будут использовать один и тот же контекст сохранения при работе внутри одной и той же транзакции. Я думаю, это то, что вам нужно.

person axtavt    schedule 17.01.2011
comment
Спасибо за быстрый ответ. Означает ли это, что невозможно иметь только ОДИН экземпляр PersistenceContext для многих экземпляров DAO? - person hsd; 17.01.2011
comment
Только по дополнительному вопросу. Возможно ли иметь PersistenceContextType.EXTENDED, который является общим для всех моих DAO? - person hsd; 17.01.2011
comment
@hsd: Целью EXTENDED контекста сохранения является создание контекста сохранения, связанного с конкретным экземпляром объекта с отслеживанием состояния. DAO обычно не имеют состояния. Если вы понимаете это и действительно имеете объект с состоянием, который вызывает методы ваших DAO, вы можете внедрить в него контекст EXTENDED и передать его методам DAO в качестве параметра. - person axtavt; 17.01.2011