Jak přenést entity mezi regulátor a metody poskytování služeb v Spring Data JPA?

0

Otázka

Podívejme se na Jaře Boot (Spring Data JPA) aplikace s řadičem a služby jako v příkladu níže:

  • processEntity() načte objekt z databáze a procesy/aktualizace.
  • publishEntity() je to samostatná metoda, znovu načítání objektu z databáze, a publikování na jiný systém. To vyžaduje, aby "poslední" stav subjektu z databáze.

Našel jsem několik blogů a článků, které doporučují pracovat s entitou v regulátoru, tj. mimo rámec transakce. Takže můj tříd vypadat takto:

@Service
public SomeService {

    @Transactional
    public void processEntity(long id) {
        final SomeEntity someEntity = entityRepository.findById(id);
        // process entity...
        entityRepository.save(someEntity);
    }

    @Transactional(readOnly = true)
    public void publishEntity(long id) {
        final SomeEntity someEntity = entityRepository.findById(id);
        // publish entity to another system...
    }
}

@RestController
public SomeController {

    @GetMapping(path = "/api/entity")
    public ResponseEntity<Void> getEntity() {
        someService.processEntity(1);
        someService.publishEntity(1);
    }
}

Je tento přístup rozumný? Nebo jsou tam lepší vzory pro takový případ použití? By to být považováno za "špatné praxe", pokud processEntity vrátil samotná účetní jednotka k regulátoru, který prochází to publishEntity?

java spring spring-boot spring-data-jpa
2021-11-23 18:05:30
2

Nejlepší odpověď

2

Vykazujících subjektů a přijímající subjekty ve vašem Řadiče je obvykle špatné praxe a častým zdrojem problémů (nechápejte mě špatně, že to skutečně funguje, ale pokud vaše případy užití jsou tak jednoduché, budete pravděpodobně čelit nějaké omezení, zatímco dělá tak). Byste měli použít DTOs místo, které by bylo obdobné třídy k vašemu subjektem, ale může představovat několik pohledů z vašeho modelu domény (vaše subjekty ve vašem případě).

Existuje několik důvodů pro použití DTOs:

  • To umožňuje oddělení obav mezi vaše domain model a své "veřejné" model, což vám umožní změnit jeden, aniž byste museli měnit ostatní.
  • To vám umožní snadno mít více pohledů vašeho subjekty bez nutnosti zahrnout Jackson magie anotace zahrnout nebo vyloučit některé vlastnosti ve vaší entity tříd.

Můžete si přečíst více o tomto v následující online zdroje: https://www.baeldung.com/java-dto-pattern.


Pokud se rozhodnete použít DTOs, zvažte také pomocí mapovače koncových bodů, jako jsou ty následující:

Nemám moc rád jejich použití (dávám přednost mapování na můj vlastní), ale můžete je najít užitečné. Mapování může být provedeno v Servisní vrstva sama o sobě nebo v Regulátoru vrstvy. Tam jsou výhody a nevýhody pro každý z přístupů, ale řekl bych, že je to opravdu přijde na preference.

2021-11-23 19:00:28
2

Doporučuje se použít DTO objekty mezi regulátor a služby. V případě, že se rozhodnete odstranit databáze a použít nějaký externí systém, později, pak regulátor vrstva nebude mít vliv.

2021-11-23 18:22:21

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................