Создание 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() {...}

Вы должны вернуть ресурсы вместо сущностей клиенту.

Другие вопросы по тегам