Почему Spring Roo дает persist () Propogation.REQUIRES_NEW - PullRequest
3 голосов
/ 02 февраля 2011

Я просматривал код, сгенерированный Spring Roo, и заметил, что создаваемый им метод persist() имеет значение Propagation.REQUIRES_NEW. Разве распространения по умолчанию будет недостаточно?

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void Entity.persist() {
    if (this.entityManager == null) this.entityManager = entityManager();
    this.entityManager.persist(this);
}

Некоторая дополнительная информация. Вот журнал ру, который произвел этот код:

// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log opened at 2011-02-04 10:01:02
project --topLevelPackage org.sotest.sscce --projectName Test --java 6
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log closed at 2011-02-04 10:01:04
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log opened at 2011-02-04 10:01:06
persistence setup --database GOOGLE_APP_ENGINE --provider DATANUCLEUS
entity --class ~.entities.Entity
exit
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log closed at 2011-02-04 10:02:55

Я использую базу данных GAE с провайдером DN. Я просто создал сущность, я не трогал какие-либо файлы, кроме выдачи вышеуказанных команд roo. Когда я открываю Entity_Roo_Entity.aj, я получаю вышеуказанный код.

Я попробую это еще раз в последней версии Roo и проверю тот же вывод. Я также опубликую этот вопрос на форуме, связанном с Roo.

Обновление: тот же код генерируется с Roo 1.1.1 (последняя версия)

1 Ответ

2 голосов
/ 04 февраля 2011

ВТОРОЙ ОТВЕТ (после добавления дополнительной информации к вопросу)

Вероятно, это связано с использованием GAE.Хранилище данных GAE не использует традиционную семантику транзакций.См. Описание изоляции транзакции GAE здесь .В частности:

Запросы и запросы внутри транзакции гарантированно видят один непротиворечивый моментальный снимок хранилища данных по состоянию на начало транзакции.... Это непротиворечивое представление снимка также распространяется на чтение после записи внутри транзакции.В отличие от большинства баз данных, запросы и запросы внутри транзакции хранилища данных не видят результатов предыдущих записей внутри этой транзакции.В частности, если объект изменен или удален в транзакции, запрос или получение возвращает исходную версию объекта на момент начала транзакции или ничего, если объект не существовал тогда.

Есть также ограничения на запросы внутри транзакции .Имея это в виду, REQUIRES_NEW, вероятно, добавляется так, чтобы любые последующие чтения сущности в рамках «первой» транзакции работали, как ожидалось.Кажется запутанным и нестандартным, но, возможно, это лучший вариант при работе в ограничениях GAE.

ПЕРВЫЙ ОТВЕТ

Должно быть недоразумениеили что-то еще в игре.Я только что проверил с Roo v1.1.1 генерацию простого объекта с провайдером Hibernate, и используется распространение транзакций по умолчанию.Это также несколько проверено в документации :

Все методы сохранения настроены на поддержку транзакций Spring (Propagation.REQUIRED, Isolation.DEFAULT).

Использование Propagation.REQUIRES_NEW не имело бы смысла для постоянных методов по умолчанию.

Я не специалист по Roo, поэтому даже не могу придумать ничего, что могло бы сделать это.Возможно, вам следует опубликовать больше вашего кода, особенно любые нестандартные конфигурации.Случайные вопросы / идеи:

  1. Используете ли вы провайдера Hibernate или?
  2. Любая нестандартная конфигурация устройства сохранения?
  3. См. Propagation.REQUIRES_NEW на всехвашей сущности сохраняются методы?
  4. Где вы видите аннотацию распространения.(например, в файле * _Entity.aj?)
  5. Есть ли вероятность, что у вашего класса сущностей (или одного из его родителей) есть собственный метод .persist (таким образом, переопределяя сгенерированный метод Ру).

    1 : http://static.springsource.org/spring-roo/reference/html/base-persistence.html

1 : ах.Я думаю, что это, скорее всего, связано с использованием поставщика GAE / DN.Я изменю свой ответ соответственно.А пока посмотрите заметки об изоляции транзакций GAE здесь: http://code.google.com/appengine/docs/java/datastore/transactions.html.

...