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; }
Peut-être sera-t-il possible de généraliser tout cela d'une manière ou d'une autre?
3 Réponses :
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; }
Comment cela se rapporte-t-il à ma question? Mes classes héritent déjà d'une classe abstraite
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()
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; }
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