- Явные транзакции Begin и Commit являются явными.
Что Spring делает с вашими компонентами репозитория (например, BankRepository
), он создает прокси вокруг него итогда он готов быть введенным другим соавторам, что в вашем случае DatabaseManagerDAO
.Однако, если вы создаете объект самостоятельно, как и вы:
BankRepository bankRepository = RepositoryFactory.getRepository(BankRepository.class);
Вместо ожидаемого прокси-сервера Spring (который уже выполняет управление транзакциями для вас), вы получаете простой объект, который ничего не знает за его пределами.немедленное объявление.
Вместо этого вам нужно довериться Spring , чтобы выполнить сантехнику за вас, и просто ввести боб bankRepository
в DatabaseManagerDAO
(хотя я этого не делаюдействительно думаю, что вам нужны и DAO, и Repository, поскольку эти термины действительно означают одно и то же:)
- Фабрика репозитория здесь, в которой я не уверен, если мне нужно ...
Нет необходимости в другой абстракции.Просто вставьте его как компонент в любой компонент, в котором он нуждается.
bankRepository
должно быть @Autowired
, но когда я это делаю, я получаю null
.Тем не менее, в этом тестовом примере он имеет автоматическую связь и работает.
В случае, если работает , вы запускаете тест с AbstractTransactionalJUnit4SpringContextTests
,который знает о bean-компоненте bankRepository, следовательно, автоматически связывает его.В вашем DatabaseManagerDAO
я не вижу ни автоматического подключения, ни установщика для bankRepository
, фактически вы создаете его вручную с завода.
РЕДАКТИРОВАТЬ, чтобы отвечать на комментарии
Что jpa:repositories
в вашей конфигурации XML действительно делает => он сканирует пакет и создает бины Spring для каждого компонента, который либо аннотирован как @Repository
, либо реализует интерфейс Repository
.
Имея это в видудля использования BankRepository
в вашем DatabaseManagerDAO
репозитории необходимо ввести его.Вы можете сделать это через «autowiring»:
@Service
public class DatabaseManagerDAO {
@Autowired
BankRepository bankRepository;
...
}
вместо того, чтобы вручную создавать его на своем заводе.
Опять же, DatabaseManagerDAO
в вашем случае, вероятно, является услугой (@Service
), а не DAO
, но я оставлю на ваше усмотрение решение по этому вопросу.
Обратите внимание, что * Spring должен также загружать DatabaseManagerDAO
, чтобы работала автоматическая разводка, поэтому убедитесь, что у него есть одна из аннотаций Spring (@Service
/ @Component
) при сканировании пакета (например, <context:component-scan base-package="org.example"/>
)).