java - 为通用数据库模型设计数据访问层

标签 java spring architecture dao

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




我是一个相当缺乏经验的初级开发人员,在德国的一家初创公司工作。我目前正在重构一个高度分散的代码库,试图稍微优化设计......

问题

在实现数据访问层时,我们可以选择遵循 DAO 模式的原则。只要我们处理的实体相当具体(例如,用户、发票、帐户等),这种方法就可以很好地工作。
但是当我们有一个更通用的数据库模型时,我们可能经常觉得需要查询由多个表组成的特定结果集。通常我们应该将查询方法分配给哪个数据访问对象并不明显。

示例

以 OSM (openstreetmap.org) 数据库为例:实际上只有节点、方式和关系构成了许多不同对象(如街道、建筑物、交通标志等)的表示。当查询便利设施时,它可能由单个节点(单个点,例如纪念馆)、路径(路径,可以说博物馆的轮廓)或路径集合(例如大学校园的建筑物)表示。

除此之外,我可能只对可用信息的一小部分感兴趣,而且获取完整实体可能会产生开销。或者我可以在我的查询中使用特定于数据库的函数,这会导致从底层实体模型中进一步抽象的结果。

我给你一个代码示例(在 java 中,使用 spring-frameworks 存储库接口(interface)):

public class IWayRepository extends Repository<Way, Long> {
    ...
    @Query(value = "select distinct ways.tags->'addr:interpolation' as type,"
      + "trim(both '{}' from text(ways.nodes)) as nodes from nodes, way_nodes, ways "
      + "where nodes.tags->'addr:street'=? and way_nodes.node_id=nodes.id "
      + "and ways.id=way_nodes.way_id "
      + "and st_intersects(st_geometryfromtext(?,4326),nodes.geom)"
      + "and exist(ways.tags,'addr:interpolation')=true", nativeQuery = true)
    List<Map<String, Object>> findAdressInterpolationInfoForStreetInBbox(String street,
      String bbox);
    ...
}

代码查询多个表,使用数据库层上的函数更改数据,并返回几乎不适合给定实体域的数据提取。

理念

为了改进设计,我现在想到了两种选择。
  • 组成一个更具体的数据访问类:AddressRepository,我在其中访问裸结果集。但我真的不喜欢这个主意。
  • 组成一个更通用的服务类:例如一个 LocalizationService。

  • 问题

    是否有任何既定的做法来处理这种情况?如何设计对通用数据库模型的数据访问。有没有应该遵循的模式?

    先感谢您!

    最佳答案

    您可以利用管理器(即 mediator)设计模式的解决方案。你可以有多个 DAO 类和一个管理器来控制它:http://tutorials.jenkov.com/java-persistence/dao-manager.html .正如您所指出的那样,管理器提供对将要使用的 DAO 的访问权限,介于更具体或通用的 DAO 之间。

    关于java - 为通用数据库模型设计数据访问层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24144477/

    相关文章:

    java - 如何使用 Channels 和 Scala 并行下载文件?

    java - 在 spring 中使用 jdbctemplate 触发 Sequence.nextval 查询

    java - android gmail 应用程序,如 ListView ,图标中有 4 个图标

    java - Objectify 中的多对多关系具有强一致性

    c# - C# 中的三层应用程序 - 放置数据和业务模型的位置

    scala - 代码执行的并行化/集群选项

    java - 如果我已经有 .jar 可执行文件,如何使用谷歌云虚拟机实例作为服务器?

    java - 如何将 Spring OAuth2 Server 集成到 Liferay 中

    java - 如何在Java Spring @PropertySource注释中将字符串更改为小写

    c# - 新的 ASP.NET Web 应用程序的体系结构