【问题标题】:Repository Pattern - Java example for composite objects存储库模式 - 复合对象的 Java 示例
【发布时间】:2018-06-09 14:28:00
【问题描述】:

我很难理解存储库模式。

我无法理解的一件事,大多数教程建议,存储库应该像内存数据库一样,即它们应该有 add()remove()find() 等方法.但是,如果我没有使用像Hibernate 这样的任何持久性框架,我应该将这些对象保存到数据库的逻辑放在哪里?是否应该有一个单独的数据访问层

当一个对象包含对另一个对象的引用时会发生什么?

例如,一个Customer 可以有多个Address(es),并且CustomerAddress 之间存在标识关系

public class Customer {
    private String firstName;
    private String lastName;

    private List<Address> addresses; // one or more addresses


    // ...

}

public class Address {
    protected String street;  
    protected String city;

    // ...
}

是否应该为CustomerAddress 提供两个单独的存储库?

如果涉及到一个查找表(例如,一个Book 具有一个Owner,在一个非识别关系中),这样的存储库结构应该是什么样子?

【问题讨论】:

  • 这是设计问题,您可以在 CustomerDao 中使用 addAddress() 方法。或者您可以为客户地址相关的查询定义单独的 CustomerAddressDao 类。

标签: java design-patterns dao


【解决方案1】:

对我来说,存储库模式只是一个对象,负责从底层存储中持久化和检索域对象。

但是,如果我没有使用任何像 Hibernate 这样的持久性框架,那么 我应该把这些对象保存到数据库的逻辑吗?应该有 是单独的数据访问层吗?

我认为拥有另一个数据访问层没有任何显着的好处,因为存储库已经负责持久化和访问数据。只需将这些逻辑放在存储库中即可。首先保持简单,直到您看到拥有额外数据访问层的好处。

当一个对象包含对另一个对象的引用时会发生什么? 客户和地址是否应该有两个单独的存储库?

是的。我将为客户和地址提供单独的存储库。根据您使用的持久化技术,您可以将客户及其地址放在一起(例如,在 JDBC 案例中使用简单的 JOIN)。或者您可以通过将AddressRepository 注入CustomerRepository 来重复使用AddressRepository,以帮助您获取客户的地址。

【讨论】:

    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 2011-10-16
    • 2012-01-27
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多