0
votes

Comment créer un JpaRepository commun pour plusieurs classes?

J'écris une application Rest en utilisant Spring-Boot , MVC , Jpa (Hibernate) . J'ai des classes de référence qui stockent, par exemple, les noms de pays , fabricants , types de café , etc. Ils héritent tous de GeneralCatalog via l'héritage @MappedSuperClass . Il s'avère qu'il y a trop de code et d'interfaces lorsque vous travaillez avec eux. Comment pouvez-vous réduire le nombre d'interfaces, ainsi que le code dans les contrôleurs. De plus, les méthodes sont les mêmes. Peut-être pouvez-vous créer une interface commune pour tous?

Classe GeneralCatalog:

public interface CountriesRepository extends JpaRepository<Countries, Long> {
}

Pays:

@Api(value = "Catalog", tags = {"catalog"})
@RestController
@RequestMapping("/catalog")
public class CatalogController<T> {

    private CatalogService catalogService;

    @Autowired
    public CatalogService getCatalogService() {
        return catalogService;
    }

    @GetMapping("/countries")
    public List<Countries> findCountries(){
        return catalogService.findCountries();
    }

    @GetMapping("/manufacturers")
    public List<Manufacturer> findManufacturers(){
        return catalogService.findManufacturers();
    }

    @GetMapping("/roastings")
    public List<Roasting> findRoastings(){
        return catalogService.findRoastings();
    }

    @GetMapping("/packagings")
    public List<Packaging> findPackagings(){
        return catalogService.findPackagings();
    }

    @GetMapping("/teacolors")
    public List<TeaColor> findTeaColors(){
        return catalogService.findTeaColors();
    }

    @GetMapping("/coffeetypes")
    public List<CoffeeType> findCoffeeTypes(){
        return catalogService.findCoffeeTypes();
    }

    @GetMapping("/teatypes")
    public List<TeaType> findTeaTypeS(){
        return catalogService.findTeaTypeS();
    }
}

...

Toutes les classes sont également héritées sans leurs lignes supplémentaires.

CatalogService:

@Service
public class CatalogService {

    // Fields
    //
    private CountriesRepository countriesRepository;

    private ManufacturerRepository manufacturerRepository;

    private RoastingRepository roastingRepository;

    private PackagingRepository packagingRepository;

    private TeaColorRepository teaColorRepository;

    private CoffeeTypeRepository coffeeTypeRepository;

    private TeaTypeRepository teaTypeRepository;


    // Setters
    //
    @Autowired
    public void setCountriesRepository(CountriesRepository countriesRepository) {
        this.countriesRepository = countriesRepository;
    }

    @Autowired
    public void setManufacturerRepository(ManufacturerRepository manufacturerRepository) {
        this.manufacturerRepository = manufacturerRepository;
    }

    @Autowired
    public void setRoastingRepository(RoastingRepository roastingRepository) {
        this.roastingRepository = roastingRepository;
    }

    @Autowired
    public void setPackagingRepository(PackagingRepository packagingRepository) {
        this.packagingRepository = packagingRepository;
    }

    @Autowired
    public void setTeaColorRepository(TeaColorRepository teaColorRepository) {
        this.teaColorRepository = teaColorRepository;
    }

    @Autowired
    public void setCoffeeTypeRepository(CoffeeTypeRepository coffeeTypeRepository) {
        this.coffeeTypeRepository = coffeeTypeRepository;
    }

    @Autowired
    public void setTeaTypeRepository(TeaTypeRepository teaTypeRepository) {
        this.teaTypeRepository = teaTypeRepository;
    }
    //


    // METHODS
    //
    public List<Countries> findCountries(){
        return countriesRepository.findAll();
    }

    public List<Manufacturer> findManufacturers(){
        return manufacturerRepository.findAll();
    }

    public List<Roasting> findRoastings(){
        return roastingRepository.findAll();
    }

    public List<Packaging> findPackagings(){
        return packagingRepository.findAll();
    }

    public List<TeaColor> findTeaColors(){
        return teaColorRepository.findAll();
    }

    public List<CoffeeType> findCoffeeTypes(){
        return coffeeTypeRepository.findAll();
    }

    public List<TeaType> findTeaTypeS(){
        return teaTypeRepository.findAll();
    }
}

CatalogController:

@Entity
@Table(name = "countries")
public class Countries extends GeneralCatalog{
}

Par exemple une interface:

@Data
@MappedSuperclass
public abstract class GeneralCatalog {

    protected  @Id
    @GeneratedValue
    Long id;

    protected String name;

    protected boolean isDeleted;
}

 entrez la description de l'image ici

entrez la description de l'image ici

Peut-être sera-t-il possible de généraliser tout cela d'une manière ou d'une autre?


4 commentaires

Vous ne pouvez pas rechercher une MappedSuperclass, vous ne pouvez donc pas faire grand chose ici. Vous pouvez cependant envisager d'utiliser l'extension Spring Data Rest pour que les contrôleurs soient générés automatiquement au moment de l'exécution pour ces référentiels. Vous pouvez donc supprimer les classes de contrôleur et de service et simplement configurer l'extension REST pour CRUD (ou un sous-ensemble d'opérations CRUD).


Pourriez-vous fournir un lien vers ce sujet ou suggérer comment le rechercher sur Google?


spring.io/projects/spring-data-rest


Bien! Merci


3 Réponses :


0
votes

Vous pouvez utiliser l'héritage comme celui-ci et étendre cette classe à partir des entités enfants

public abstract class AbstractBaseEntity implements Serializable {
private static final long serialVersionUID = 6204877037070575919L;

public abstract Long getId();

public AbstractBaseEntity() {
}

public AbstractBaseEntity(ZonedDateTime createdDate, ZonedDateTime lastModifiedDate, String createdBy, String lastModifiedBy) {
    this.createdDate = createdDate;
    this.lastModifiedDate = lastModifiedDate;
    this.createdBy = createdBy;
    this.lastModifiedBy = lastModifiedBy;
}

@CreatedDate
@Column(name = "created_date", nullable = false, updatable = false)
private ZonedDateTime createdDate = ZonedDateTime.now();

@LastModifiedDate
@Column(name = "last_modified_date")
@JsonIgnore
private ZonedDateTime lastModifiedDate = ZonedDateTime.now();

@CreatedBy
@Column(name = "created_by", updatable = false)
private String createdBy;

@LastModifiedBy
@Column(name = "last_modified_by")
private String lastModifiedBy;
}


1 commentaires

Comment cela se rapporte-t-il à ma question? Mes classes héritent déjà d'une classe abstraite



0
votes

En fait, vous pouvez utiliser la mise en veille prolongée et l'API de critères directement pour gérer votre cas d'utilisation.

C'est tout droit comme:

session.createCriteria(entityClass).list()


0 commentaires

1
votes

J'ai créé des méthodes pour créer des éléments jpa simples, vous pouvez en voir plus sur https://github.com/fajaralmu / base_web_app

exemple:

public List<Page> getAllPages() {
        List<Page> allPages = entityRepository.findAll(Page.class);
        
        return   allPages;
    }

 entrez la description de l'image ici


0 commentaires