Создание Spring @Repository и @Controller для каждого элемента, с которым я работаю (из базы данных)
При работе с проектом, который включает запрос нескольких типов данных из базы данных, я пришел к следующему вопросу: допустим, у меня есть 2 Java-класса, которые соответствуют объектам базы данных:
Маршруты
public class Route {
public Route(int n, int region, Date fdate, boolean changed, int points,
int length) {
super();
this.n = n;
this.region = region;
this.fdate = fdate;
this.changed = changed;
this.points = points;
this.length = length;
}
}
Перевозчик
public class Carrier {
public Carrier(...) {
this.id = src.getId();
this.name = src.getName();
this.instId = src.getInstId();
this.depotId = src.getDepotId();
}
Если да, то каков правильный подход к созданию интерфейсов и классов Dao? Я делаю это так -
@Repository
public class CarrierDaoImpl implements CarrierDao{
@Autowired
DataSource dataSource;
public List<Carrier> getAllOrgs() { ... }
}
@Repository
public class RoutesDaoImpl implements RoutesDao {
@Autowired
DataSource dataSource;
public ArrayList<AtmRouteItem> getRoutes(AtmRouteFilter filter) { ... }
}
Я создаю @Repository DAO для каждого объекта java class item\db, а затем 2 отдельных контроллера для запросов о перевозчиках и маршрутах. Как это:
@RestController
@RequestMapping(path = "/routes")
public class RoutesController {
@Autowired
RoutesDao routesDao;
@GetMapping(value = {"/getRoutes/", "/getRoutes"})
public ArrayList<Route> getRoutes() { ... } }
И то же самое для диспетчера. Это правильно, и если нет, то каков правильный подход?
Извините за проблемы с оформлением, это мой первый вопрос по stackru:)
2 ответа
Я бы предложил создать сервисы с пометкой @Service
аннотация (то есть CarrierService
интерфейс и CarrierServiceImpl
реализация). Чем вводить их в контроллеры. Используйте репозитории внутри сервисов, потому что для некоторых операций с базой данных требуются транзакции, а лучшим местом для управления транзакциями являются сервисы. Также службы могут выполнять более специализированную работу, которая потребует доступа к нескольким репозиториям, чтобы вы могли внедрить их. И не забудьте пометить свои услуги @Transactional
аннотаций.
Правильно иметь DAO для каждого субъекта. При работе с репозиториями JPA у вас нет другого выбора, кроме как предоставить объект. Например:
public interface FooRepository extends JpaRepository<Foo,Long>{}
То же самое для контроллеров REST, вы должны объединить функциональные возможности по объектам, как и вы.
Вы можете улучшить свое отображение, чтобы быть более RESTful. Чтобы получить все маршруты, не указывайте путь:
@GetMapping
public ArrayList<RouteResource> getRoutes() { ... }
(Я никогда не использую @GetMapping, но это должно работать так)
И если вы хотите конкретный маршрут:
@GetMapping("/get/{id}")
public RouteResource getRoute() {...}
Вы должны вернуть ресурсы вместо сущностей клиенту.