Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring AbstractRepository / 5 сообщений из 5, страница 1 из 1
19.11.2014, 18:03
    #38811072
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring AbstractRepository
Помогите разрулить такой вот вопрос :

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


Код: 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
19.11.2014, 18:22
    #38811085
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring AbstractRepository
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
19.11.2014, 18:26
    #38811088
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring AbstractRepository
@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
20.11.2014, 09:32
    #38811451
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring AbstractRepository
Вопрос как обязать реализовать метода 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
10.12.2014, 16:54
    #38830474
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring AbstractRepository
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring AbstractRepository / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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