Dao模式和业务对象关系

时间:2012-08-30 09:09:04

标签: design-patterns dao

我正在开发一个Android应用程序,因为我需要访问数据库,所以我决定使用dao模式。目前,我理解这种模式的概念。

在我的应用中,我有我的业务对象。例如,让我们考虑订单和付款对象。我们假设订单作为付款类型的变量。在数据库中,表订单的每个记录都有一个支付表的外键,用于保持订单与支付之间的关联。问题是,由于dao应该完全相互独立,OrderDao不会“知道”PaymentDao,那么我如何实例化一个订单对象,其中包含相应的支付实例?这让我很困惑...... OrderDao将无法返回订单实例,因为这个实例需要一个支付实例..我可以做一些“技巧”,比如OrderDao返回一个初始化为支付的实例只有它的id,后来在业务逻辑中,抓住那个id并使用PaymentDao来检索付款实例并将其设置为之前的订单...但这听起来并不好......

应该怎么做?

只是为了让我对类结构的解释变得容易:

public class Order {
     private int id;
     private Payment payment;
     ......
}
public class Payment {
    private int id;
     ....
}

我没有使用任何框架的原因是因为在我的数据库中,我需要一些表来保存一些字符串。例如,如果我们有一个类别表,我会有一个categories_i18n表,每个表记录在类别表中,会有一些语言的相应翻译..

提前致谢。

2 个答案:

答案 0 :(得分:3)

您的DAO返回对象图表没有任何问题。我使用Hibernate进行ORM并以你为例,我将有一个PaymentDao,它有处理Payment对象的方法(findById,persist等)和OrderDao来处理Order对象。

但是,如果我从OrderDao中检索Order对象,那么它仍将包含对相关PaymentObject的引用(您可以使用Hibernate懒惰地加载这些子对象,因此无需担心返回巨大的性能开销对象图 - 你需要调查你选择的持久性框架来帮助你。

HTH

PS在hibernate中具有公司引用的Order实体示例:

   @Entity
    @Table(name = "ORDERS")
    @SequenceGenerator(allocationSize = 1, name = "orderId", sequenceName = "ORDERID")
    public class Order extends OptimisticLockingNumericIdDto<Order> implements Serializable {

        private Long id;
        private Company managingCompany;

...

       @ManyToOne(targetEntity = Company.class)
        @JoinColumn(name = "COMPANYID")
        public Company getManagingCompany() {
            return managingCompany;
        }

        public void setManagingCompany(Company managingCompany) {
            this.managingCompany = managingCompany;
        }
}

答案 1 :(得分:1)

我认为,您正在数据库中错误地建模类关系。根据您的要求您的订单类具有付款类的实例,因此当您映射到数据库时,它应该是具有订单ID作为外键的付款。

以这种方式映射它。您可以先从OrderDAO获取订单,然后使用getPaymentByOrderID方法从PaymentDAO获得付款。通过这种方式,您的DAO将是独立的,您将获得所需的功能。