2012-01-15 1 views
1

EntityManger вводится аннотацией @PersistenceContext. Это метод из моего класса «DAO/Repository», который не аннотируется. Этот класс вводится в EJB, который должен получать данные из/в базу данных.Что происходит после EntityManager.persist()

До сих пор я думал, что после того, как метод persist ниже закончен, persistencecontext очищается и данные хранятся в базе данных, но из того, что происходит в моем приложении, я начинаю сомневаться в этом. Я создал источник данных и пул соединений в Glassfish, поэтому я использую транзакции, управляемые контейнерами, насколько мне известно, однако я не использую никаких аннотаций транзакций.

Может ли кто-нибудь пролить свет на это для меня?

public void persist(QuestionFeedback questionFeedback) { 
    questionFeedback.setCreated(new Date()); 
    entityManager.persist(questionFeedback); 
} 

Использование Glassfish 3, Java EE6 Совместимость

ответ

0

Если вы не используете какие-либо сделки аннотации будут сделки время требуется по умолчанию. Таким образом, ваш DAO будет запущен в транзакции, а контекст персистентности не будет очищаться позже, чем при совершении транзакции.

Из JavaDoc на TransactionAttribute:

Если TransactionAttribute аннотации не указано, а компонент использует контейнер управляемого демаркации транзакций, семантика Обязательный атрибут транзакции предполагается.

Из JavaDoc на FlushModeType:

Когда запросы выполняются в рамках транзакции, если FlushModeType.AUTO устанавливается на запрос или TypedQuery объекта, или если промывочная установка режима для контекста Настойчивость Для объекта Query или TypedQuery параметр AUTO (по умолчанию) и режим флеша не указан, поставщик обеспечения устойчивости несет ответственность за то, что все обновления состояния всех объектов в контексте персистентности, которые могут потенциально повлиять на результат запроса видны для обработки запроса.

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

3

Метод persist делает объект постоянным, но еще не записывает изменения в базу данных. Обычно это происходит, когда транзакция совершается (поставщик может оптимизировать это, это может произойти раньше).

С помощью flush вы можете принудительно выполнить запись раньше, но она по-прежнему будет видна только для кода, который участвует в текущей транзакции. Чтобы сделать запись постоянной (видимой для всего внешнего кода), транзакция все еще должна быть зафиксирована.

Без каких-либо явных аннотаций ваш EJB-компонент по умолчанию будет транзакционным.

0

Поскольку EntityManager вводится через аннотацию @PersistenceContext, вы наверняка используете транзакции, управляемые контейнером.

В любом случае, ваше предположение о том, что persist вызывает фиксацию транзакции, неверно. Изменения, выполненные с помощью persist, выполняются в базе данных в commit. Документация EntityManager говорит, что «новый экземпляр становится управляемым и постоянным, вызывая persist».В этом контексте «становится упорным» не означает, что в этот момент сущность сохраняется в базе данных. В тот момент, когда вызывается persist, объект сохраняется в терминах PersistenceContext. Затем он будет сохраняться в базе данных, последней, когда совершается транзакция.

Поскольку вы не используете аннотации @TransactionAttribute для своих методов, применяется по умолчанию. По умолчанию используется TransactionAttributeType.REQUIRED. Это заставит контейнер создавать транзакцию при вызове первого бизнес-метода и распространении этого на другие методы. Ваша транзакция будет зафиксирована при завершении вызова первого бизнес-метода. Затем ваши изменения находятся в базе данных (если откат не выполнялся).

+0

Так что вы говорите, что бизнес-метод открывает и закрывает транзакцию (тот, который вызывает метод persist выше в моем коде), и после этого транзакция завершена? Или я неправильно понимаю вас? – LuckyLuke

+0

Да, если клиент метода, который вызывает метод persist, не имеет контекста транзакции. Затем в вашем случае контейнер должен заботиться о начале и фиксации транзакции в начале и конце метода. Если у клиента есть существующая транзакция, то ваш метод присоединяется к этому, а фиксация происходит где-то на клиенте. Неважно, сколько слоев этих методов вызывает без определенного атрибута транзакции, логика остается прежней: транзакция начинается и фиксируется в первом. –

 Смежные вопросы

  • Нет связанных вопросов^_^