【问题标题】:Dao pattern and business objects relationships道模式和业务对象关系
【发布时间】:2012-08-30 09:09:03
【问题描述】:

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

在我的应用程序中,我有我的业务对象。例如,让我们考虑 order 和 payment 对象。让我们假设一个订单作为支付类型的变量。在数据库中,订单表的每条记录都将有一个用于支付表的外键,用于保持订单与其支付之间的关联。问题是,由于 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 表,对于每个分类表中的记录,在某些语言中会有相应的翻译..

提前致谢。

【问题讨论】:

    标签: design-patterns dao


    【解决方案1】:

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

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

    HTH

    PS 在休眠中具有公司引用的订单实体示例:

       @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;
            }
    }
    

    【讨论】:

    • 是的,我知道在休眠中我们可以做到这一点。这里的事情是我没有使用任何框架。我已经搜索了一些关于 android 的内容,但他们的文档很少......
    • 为什么不使用框架 - 您可以将休眠用于 Android 应用程序,还有很多其他应用程序。以下是更多信息:stackoverflow.com/questions/4257374/…
    • 我试试OrmLite。谢谢你的建议。虽然我认为我会保持这个话题的开放,只是看看是否有人在不使用框架的情况下给出了一些提示。谢谢 :)
    【解决方案2】:

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

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

    【讨论】:

    • 我正在按照您所说的方式进行映射。实际上,您所说的那个解决方案,就是我所说的“技巧”:p
    猜你喜欢
    • 2010-10-27
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2021-01-12
    • 2013-11-11
    相关资源
    最近更新 更多