在处理涉及从数据库请求多种数据类型的项目时,我遇到了以下问题:
假设我有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) { ... }
}
我为每个java类item \ db实体创建一个@Repository DAO,然后为2个独立的控制器创建有关运营商和路由的请求。像这样:
@RestController
@RequestMapping(path = "/routes")
public class RoutesController {
@Autowired
RoutesDao routesDao;
@GetMapping(value = {"/getRoutes/", "/getRoutes"})
public ArrayList<Route> getRoutes() { ... } }
对于控制器运营商而言也是如此。这是正确的,如果不是正确的方法是什么?
抱歉有关样式问题,这是我关于stackoverflow的第一个问题:)
答案 0 :(得分:0)
为每个实体设置DAO是正确的。 使用JPA存储库时,您别无选择,只能提供实体。例如:
public interface FooRepository extends JpaRepository<Foo,Long>{}
对于REST控制器,您必须像对象一样按对象汇集功能。
您可以将映射改进为更加RESTful。要检索所有路线,请不要指定路径:
@GetMapping
public ArrayList<RouteResource> getRoutes() { ... }
(我从未使用@GetMapping,但它应该像那样工作)
如果你想要特定的路线:
@GetMapping("/get/{id}")
public RouteResource getRoute() {...}
您应该将资源而不是实体返回给客户。
答案 1 :(得分:0)
我建议创建标有@Service
注释的服务(即CarrierService
接口和CarrierServiceImpl
实现)。然后将它们注入控制器。在服务中使用存储库是因为某些数据库操作需要事务处理,而管理事务的更好位置是服务。此外,服务可以执行更专业的工作,这需要访问多个存储库,以便您可以注入它们。不要忘记使用@Transactional
注释标记您的服务。