Нет гарантии, что T имеет связанный с ним GUID, и на этом языке нет средств для записи ограничения на параметр типа, чтобы сделать эту гарантию.
Имя интерфейса преобразуется в GUID компилятором, который ищет имя в таблице символов, получает структуру данных компилятора, представляющую интерфейс, и проверяет соответствующее поле для GUID. Но generics не похожи на шаблоны C ++; они должны быть скомпилированы и проверены по типу и известны для работы для любого допустимого параметра типа, а это означает ограничение параметра типа в его объявлении.
Вы можете получить GUID с помощью RTTI (сначала проверяя, что T на самом деле представляют интерфейс) с чем-то вроде GetTypeData (TypeInfo (T)) ^. Guid
и передать GUID на таким образом поддерживает
.
Вы не можете вызвать 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
}
...
Это связано с тем, как пружина генерирует транзакционные прокси.
В случае, когда у вас есть @Transactional на уровне класса, когда вы вызываете InventoryDisclosureBO.processDisclosureData()
, вы фактически вызываете Spring proxy, который запускает транзакцию, а затем вызывает реальную реализацию.
Если у вас есть только @Transaction в persis (), весна не запускает транзакцию при вызове InventoryDisclosureBO.processDisclosureData()
, а затем не может обнаружить, что вы вызвали InventoryDisclosureBO.persist()
Итак, Spring в основном игнорирует аннотацию на persist
, поскольку она не может добавить транзакционный прокси.
Как правило, аннотация @Transactional должна быть общедоступным методом и, надеюсь, достаточно высока иерархия вызовов (в противном случае каждый упор будет создавать новую транзакцию).
Вы можете найти дополнительную информацию по этому другому вопросу SO: Метод Interceptor для частных методов (любой непубличный методы ведут себя одинаково)