powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring AbstractRepository
5 сообщений из 5, страница 1 из 1
Spring AbstractRepository
    #38811072
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите разрулить такой вот вопрос :

есть такой набор классов :


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;


@NoRepositoryBean
public interface AbstractRepository<ENTITY_TYPE,ID_TYPE extends Serializable> extends JpaRepository<ENTITY_TYPE, ID_TYPE>,JpaSpecificationExecutor<ENTITY_TYPE> {

    
}



Код: java
1.
2.
3.
4.
public interface UserRepository extends AbstractRepository<User, Long>{
    
    User findByKey(String key);
}



Код: java
1.
2.
3.
4.
5.
public interface UserService extends CRUDService<User, Long>{
   
   User findByKey(String key); 
   
}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Service("usersService")
@Repository
@Transactional
public class UserServiceImpl extends CRUDServiceImpl<User, Long> implements UserService {

 // TODO  тут большой вопрос !
   @Autowired
    private UserRepository repository;
        
 
    @Override
    public User findByKey(String key) {
        return repository.findByKey(key);
    }

}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public interface CRUDService<ENTITY_TYPE, ID_TYPE> {

    public ENTITY_TYPE create(ENTITY_TYPE object);
    
    public ENTITY_TYPE get(ID_TYPE id);
    
    public ENTITY_TYPE update(ENTITY_TYPE object);

    public ENTITY_TYPE delete(ID_TYPE id)
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public abstract class CRUDServiceImpl <ENTITY_TYPE,ID_TYPE extends Serializable> implements CRUDService<ENTITY_TYPE,ID_TYPE>{

  // TODO  тут большой вопрос !
  @Autowired
  protected AbstractRepository<ENTITY_TYPE, ID_TYPE> repository;
   
    
   @Override
    public ENTITY_TYPE create(ENTITY_TYPE object) {
        return repository.saveAndFlush(object);
    }

    @Override
    public ENTITY_TYPE update(ENTITY_TYPE object) {
        return repository.saveAndFlush(object);
    }

    @Override
    public ENTITY_TYPE delete(ID_TYPE id) {
        ENTITY_TYPE deleted = get(id);
        repository.delete(id);
        return deleted;
    }

    @Override
    public ENTITY_TYPE get(ID_TYPE id) {
        return repository.getOne(id);
    }





что хочется - иметь универсальный интерфейс - на стандартные операции CRUDService

его имплементацию abstract CRUDServiceImpl

есть AbstractRepository

есть его конкретная реализация - UserRepository


каким образом в CRUDServiceImpl указать repository

чтобы в классе UserServiceImpl - инджектился конкретный репозитарий ??? UserRepository и он же использовался везде по иерархии ?
...
Рейтинг: 0 / 0
Spring AbstractRepository
    #38811085
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

единственное что приходит в голову :

Это конструктор protected CRUDServiceImpl :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public abstract class CRUDServiceImpl <ENTITY_TYPE,ID_TYPE extends Serializable> implements CRUDService<ENTITY_TYPE,ID_TYPE>{

    
    protected AbstractRepository<ENTITY_TYPE, ID_TYPE> repository;
    
    protected CRUDServiceImpl(AbstractRepository<ENTITY_TYPE, ID_TYPE> repository) {
        this.repository = repository;
    }



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
@Service("userService")
@Repository
@Transactional
public class UserServiceImpl extends CRUDServiceImpl<User, Long> implements UserService {

    
    private final UserRepository userRepository;

    @Autowired
    public UserServiceImpl(UserRepository repository) {
        super(repository);

        this.userRepository = repository;
    }

    @Override
    public User findByKey(String key) {
        return userRepository.findByKey(key);
    }



но при этом пропала возможность конструктора по умолчанию UserServiceImpl() :

Ведь иньекция и создание репозитария userRepository - происходит средствами самого спринга !


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("ru.*")
@PropertySource(value = {"classpath:application.properties"})
@ComponentScan({"ru.*"})
public class AppConfig  {

   @Bean(name = "usersService")
    public UserService actionService() {
        return new UserServiceImpl();
    }




как быть ???
...
Рейтинг: 0 / 0
Spring AbstractRepository
    #38811088
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@PostConstruct кажется очень опасным?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Service("userService")
@Repository
@Transactional
public class UserServiceImpl extends CRUDServiceImpl<User, Long> implements UserService {

    @Autowired
    private UserRepository userRepository;


    	@PostConstruct
	public void init()
	{
            repository = userRepository;
	}
    
   
...
Рейтинг: 0 / 0
Spring AbstractRepository
    #38811451
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос как обязать реализовать метода init() правильно ?

и дает ли это гарантии безопасной инициализации?

такие же как обязательный конструктор ?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public abstract class CRUDServiceImpl <ENTITY_TYPE,ID_TYPE extends Serializable> implements CRUDService<ENTITY_TYPE,ID_TYPE>{

    
   protected AbstractRepository<ENTITY_TYPE, ID_TYPE> repository;    
 
   
   @PostConstruct
   public abstract void init();
...
Рейтинг: 0 / 0
Spring AbstractRepository
    #38830474
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://docs.spring.io/spring-data/jpa/docs/1.7.x/reference/html/
Example 19. Custom repository base class
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class MyRepositoryImpl<T, ID extends Serializable>
  extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> {

  private EntityManager entityManager;

  // There are two constructors to choose from, either can be used.
  public MyRepositoryImpl(Class<T> domainClass, EntityManager entityManager) {
    super(domainClass, entityManager);

    // This is the recommended method for accessing inherited class dependencies.
    this.entityManager = entityManager;
  }

  public void sharedCustomMethod(ID id) {
    // implementation goes here
  }
}
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring AbstractRepository
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]