【问题标题】:Layered architecture and persistence annotations on the model beans?模型 bean 上的分层架构和持久性注释?
【发布时间】:2013-12-03 04:47:57
【问题描述】:

我想在新的 Java EE Web 应用程序中遵循 separation of concerns 设计原则。如果我理解正确,这意味着我必须让我的 DAL(数据访问层)的技术选择对我的模型/业务层不可见。

当我使用 Spring Data Neo4j 时,我必须使用例如注释我的模型 bean。 “@NodeEntity”,一个特定于 Spring Data Neo4J 的注解。这似乎将模型层与数据访问层混合在一起。

  • 我在这里做的分析是否正确?
  • 如果是这样,如何使用 Spring Data Neo4j 注释创建一个独立于我的 DAL 的模型?

感谢您的帮助!

【问题讨论】:

    标签: java spring spring-data-neo4j n-tier-architecture


    【解决方案1】:

    一个常见的解决方案是应用接口编程原则,为每个实体和关系创建接口,并用SDN注释类实现它们。 这样模型层就只能通过接口访问实体,对实现一无所知。 为了抽象数据库访问操作,您可以创建 DAO 接口并使用 SDN 存储库和/或 Cypher 查询来实现它们。 一个例子:

    public interface Item {
        String getName();
        ...
    }
    
    public interface ItemDAO {
        Item lookup(String name);
        ...
    }
    
    @NodeEntity
    public class ItemNode implements Item {
        @GraphId private Long id;
        private String name;
        ...
        public String getName() { return name; }
        ...
    }
    
    public class Neo4jItemDAO implements ItemDAO {
        ...
        @Override
        public Item lookup(String name) {
            return neo4jOperations.lookup(ItemNode.class,"name", name).to(ItemNode.class).singleOrNull();
        }
    }
    

    在您的模型类中,您可以通过这种方式访问​​实体:

    @Autowired ItemDAO itemDAO;
    Item item = itemDAO.lookup("name");
    

    【讨论】:

    • DAO 接口与实体接口的目的相同,在模型和数据访问层之间创建了一个抽象级别。使用 GraphRepository 直接打破了这种抽象,将 SDN 暴露给模型层。
    • 感谢接口的想法,但我还有一个问题。目前,对于每个模型类,例如“用户”,我创建了一个扩展 GraphRepository 的“UserRepository”接口。我需要创建一个新的 UserDAO 接口,还是和 UserRepository 接口一样?换句话说,Spring Data Neo4j 的 GraphRepository 接口有多标准?
    • 也许我没有提供足够的细节。事实上,我已经创建了许多项目(在 Eclipse 中),一个用于用户界面(UI 项目,它使用 JSF),一个用于业务服务,一个用于业务 bean,一个用于 DAL。如果我用接口(如您的示例中的 Item)替换我的 beans 类,那么我可以将 ItemNode(这是 Item 的 Neo4j 实现)移动到我的 DAL 代码中,这将更合乎逻辑(因为它取决于 Neo4j)。但是,我可以从 UI 项目访问我的 bean 吗?我不想在 UI 项目和 DAL 项目之间创建依赖关系。
    • 我不确定我是否明白你的意思,接口的目的是避免依赖,在 UI 类中使用模型接口是隐藏 DAL 的正确方法。
    • 我认为 @NodeEntity 注释类的正确位置是在 DAL 项目中,因此只需替换一个 jar 就可以轻松更改实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 2022-01-15
    • 2021-07-23
    • 2011-04-12
    相关资源
    最近更新 更多