Généricité en Java (complexe)
Bonjour à toutes et a tous,
Je suis face à un probleme que je n'arrive pas a resoudre.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| public interface Service<T> {
Iterable<T> findAll();
T find(Long id);
T find(String id);
void delete(Long id);
T createOrUpdate(T object);
} |
Code:
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 29 30 31
| import org.springframework.data.repository.CrudRepository;
import model.domain.BDESSecuPk;
public abstract class GenericService<T> implements Service<T> {
public abstract CrudRepository<T, Long> getRepository();
public abstract CrudRepository<T, BDESSecuPk> getRep();
@Override
public Iterable<T> findAll() {
return getRepository().findAll();
}
@Override
public T find(Long id) {
return getRepository().findOne(id);
}
@Override
public void delete(Long id) {
getRepository().delete(id);
}
@Override
public T createOrUpdate(T entity) {
T saved = getRepository().save(entity);
return saved;
}
} |
Code:
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 29 30 31 32 33 34 35 36
|
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Service;
import onet.application.dsi.dwrh.model.domain.BDESSecu;
import model.domain.BDESSecuPk;
import repository.BDESSecuRepository;
import service.generic.GenericService;
@Service
public class BDESSecuService extends GenericService<BDESSecu> {
@Autowired
private BDESSecuRepository repository;
@Override
public CrudRepository<BDESSecu, Long> getRepository() {
return null;
}
public BDESSecu findByPrimaryKey(BDESSecuPk id){
return repository.findById(id);
}
@Override
public BDESSecu find(String id) {
return null;
}
@Override
public CrudRepository<BDESSecu, BDESSecuPk> getRep() {
return repository;
}
} |
Je voudrai eviter de creer des methodes qui renvoient le type de chaque entite: je m'explique, j'ai plusieurs classes avec des clés composite, et donc quand je crée un class repository je passe la cle composé en parametre pour la classe crudRepository de spring.
Code:
1 2 3 4 5 6 7 8 9
|
import org.springframework.data.jpa.repository.JpaRepository;
import domain.AxeGeneriqueCodeLibelle;
import domain.AxeGeneriqueCodeLibellePk;
public interface AxeGeneriqueCodeLibelleRepository extends JpaRepository<AxeGeneriqueCodeLibelle, AxeGeneriqueCodeLibellePk> {
} |
J'aimerai utiliser un moyen elegant pour eviter de dupliquer le code (surtout dans la partie service de l'application)
si vous voyez la methode de cette classe
Code:
1 2 3 4 5 6 7 8 9
|
@Override
public CrudRepository<BDESSecu, Long> getRepository() {
return null;
}
@Override
public CrudRepository<BDESSecu, BDESSecuPk> getRep() {
return repository;
} |
J'etais obliger de remonter dans la classe GenerciService une methode en plus (getRep()) alors qu'à la base il y'avait juste cette methode getRepository().
ça ne marche pas parce que le type de cle primaire(cle composé change d'une classe à une autre)
J'ai pris l'exemple de ces deux methodes que j'ai dupliqué et ça ne s'arrete pas là.
je dois a vrai dire faire autant de methode que type different (c'est a dire n fois getRepository et n fois le update et n fois le delete et n fois le find etc)
Cordialement et merci