2012-05-25 3 views
0

У меня возникают проблемы с обновлением данных в моем PersistenceContext. У меня есть компонент CMT EJB3, который вызывает бит BMT EJB3. В компоненте BMT я выполняю некоторую логику процесса для объекта. Я фиксирую изменения и вижу изменения в базе данных.PersistenceContext в CMT, по-видимому, отличается от PersistenceContext в BMT

После того, как процесс завершился в моем методе BMT, я возвращаюсь к своей бленде CMT. Я возвращаю (метод .find()) мой объект из PersistenceContext (потому что бит BMT изменил некоторые значения), но я все еще получаю старые значения моего объекта. Я даже попробовал метод .refresh(), но данные не обновляются.

Возможно ли, что бобы CMT и BMT используют другой PersistenceContext?

+0

Вы пытались использовать 'getReference (entityClass, pk)' –

ответ

1

Контекст персистентности распространяется через выполняемую транзакцию, и в дополнение к этому для обычного контекста постоянства (например, нерасширенного) срок службы его кеша L1 привязан к той же транзакции.

Итак, если вы начинаете новую транзакцию в вашем BMT-компоненте, взаимодействуете со своим контекстом персистентности, а затем фиксируете, то действительно, для вызывающего CMT-компонента не будет обновленных значений в контексте персистентности.

Чтение значений, свежих из БД, должно работать. Поэтому, если вы видите эти изменения в БД, и особенно если оба компонента CMT и BMT развернуты в одном приложении (таким образом, эффекты несогласованности L2), то refresh действительно должен работать.

Что происходит при новом вызове бета-компонента CMT? Увидит ли он обновленные значения?

+0

Hi Arjan. После нового вызова компонента CMT значения обновляются да! Но я хочу, чтобы они были обновлены при первом вызове. Чтобы понять всю проблему. У меня есть объект Document, который имеет набор объектов типа «Поле». Таким образом, после вызова боб ТКМ, я: для (поля F: document.getFields()) { Запрос д = getEntityManager() CreateQuery ("Выбор п от поля, где f.document =: документ"). ; Поле f = (Поле) query.getSingleResult(); getEntityManager(). Refresh (f); } –

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