Как PlatformTransactionManager работает внутри в Spring Transaction? [Дубликат]

Нет гарантии, что T имеет связанный с ним GUID, и на этом языке нет средств для записи ограничения на параметр типа, чтобы сделать эту гарантию.

Имя интерфейса преобразуется в GUID компилятором, который ищет имя в таблице символов, получает структуру данных компилятора, представляющую интерфейс, и проверяет соответствующее поле для GUID. Но generics не похожи на шаблоны C ++; они должны быть скомпилированы и проверены по типу и известны для работы для любого допустимого параметра типа, а это означает ограничение параметра типа в его объявлении.

Вы можете получить GUID с помощью RTTI (сначала проверяя, что T на самом деле представляют интерфейс) с чем-то вроде GetTypeData (TypeInfo (T)) ^. Guid и передать GUID на таким образом поддерживает .

4
задан never 3 September 2013 в 11:40
поделиться

2 ответа

Вы не можете вызвать persist () из processDisclosureData (), потому что он принадлежит к одному классу, и он обходит транзакционный прокси, созданный Spring для InventoryDisclosureBO. Вы должны называть это из других bean-компонентов, чтобы сделать аннотации @Transactional. Когда Spring вводит ссылку на компонент InventoryDisclosureBO другим компонентам, он фактически вводит ссылку на InventoryDisclosureBOProxy, которая содержит транзакционную логику, например

    class Bean2 {

      @Autowire
      private InventoryDisclosureBO idbo;   <-- Spring will inject a proxy here

      public void persist(InventoryDisclosureStatus data) {
           idbo.persist(data);     <-- now it will work via proxy
      }
...
4
ответ дан Evgeniy Dorofeev 16 August 2018 в 01:45
поделиться
  • 1
    Спасибо, Евгений, это имеет смысл! Если я ставлю @Transactional только на метод Disclosure Data (), он работает отлично. – never 3 September 2013 в 11:52
  • 2
    1) можете ли вы, пожалуйста, увеличить его в своем ответе? Persist () будет обходить транзакционный прокси, созданный Spring для InventoryDisclosureBO & quot; – Java Geek 5 September 2013 в 17:14
  • 3
    2) idbo.persist (данные); & lt; - теперь он будет работать через прокси-сервер, это потому, что мы вызываем метод persist непосредственно извне класса? если это так, то как это имеет значение? – Java Geek 5 September 2013 в 17:15
  • 4
    @Naroji будет 2 beans в контексте InventoryDisclosureBO и InventoryDisclosureBOProxy (настоящее имя отличается). Последний создан Spring и содержит транзакционную логику и ссылку на InventoryDisclosureBO. Когда мы вызываем InventoryDisclosureBOProxy.persist, он начинает транзакцию, а затем вызывает InventoryDisclosureBO.persist. Если мы сразу вызываем InventoryDisclosureBO.persist, транзакции не будут – Evgeniy Dorofeev 6 September 2013 в 04:39
  • 5
    @EvgeniyDorofeev Спасибо, еще один вопрос частного InventoryDisclosureBO idbo; & lt; - Spring добавит сюда прокси. Как вы знаете, что Spring будет вводить прокси здесь? – Java Geek 6 September 2013 в 05:00

Это связано с тем, как пружина генерирует транзакционные прокси.

В случае, когда у вас есть @Transactional на уровне класса, когда вы вызываете InventoryDisclosureBO.processDisclosureData(), вы фактически вызываете Spring proxy, который запускает транзакцию, а затем вызывает реальную реализацию.

Если у вас есть только @Transaction в persis (), весна не запускает транзакцию при вызове InventoryDisclosureBO.processDisclosureData(), а затем не может обнаружить, что вы вызвали InventoryDisclosureBO.persist()

Итак, Spring в основном игнорирует аннотацию на persist, поскольку она не может добавить транзакционный прокси.

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

Вы можете найти дополнительную информацию по этому другому вопросу SO: Метод Interceptor для частных методов (любой непубличный методы ведут себя одинаково)

3
ответ дан Community 16 August 2018 в 01:45
поделиться
  • 1
    если @Transactional применяется на уровне класса, только тогда весна генерирует прокси транзакции? – Java Geek 5 September 2013 в 17:19
  • 2
    если @Transactional не применяется на уровне класса и методе processDisclosureData, то почему он не может обнаружить, что вы вызвали InventoryDisclosureBO.persist ()? – Java Geek 5 September 2013 в 17:20
Другие вопросы по тегам:

Похожие вопросы: