Ответ 1
Я использовал решение, описанное в этом сообщении из блога Netgloo.
Идея состоит в том, чтобы создать общий класс репозитория, например:
@NoRepositoryBean
public interface ABaseRepository<T extends A>
extends CrudRepository<T, Long> {
// All methods in this repository will be available in the ARepository,
// in the BRepository and in the CRepository.
// ...
}
то я могу написать три репозитория таким образом:
@Transactional
public interface ARepository extends ABaseRepository<A> { /* ... */ }
@Transactional
public interface BRepository extends ABaseRepository<B> { /* ... */ }
@Transactional
public interface CRepository extends ABaseRepository<C> { /* ... */ }
Кроме того, для получения репозитория только для чтения для ARepository
я могу определить ABaseRepository
как только для чтения:
@NoRepositoryBean
public interface ABaseRepository<T>
extends Repository<T, Long> {
T findOne(Long id);
Iterable<T> findAll();
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
и из BRepository
также распространяются Spring Data JPA CrudRepository
для создания репозитория чтения/записи:
@Transactional
public interface BRepository
extends ABaseRepository<B>, CrudRepository<B, Long>
{ /* ... */ }