0

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

在我的应用程序中,我有我的业务对象。例如,让我们考虑 order 和 payment 对象。让我们假设一个订单作为支付类型的变量。在数据库中,订单表的每条记录都将有一个用于支付表的外键,用于保持订单与其支付之间的关联。问题是,由于 dao 应该彼此完全独立,OrderDao 不会“知道”PaymentDao,那么我如何实例化一个带有相应支付实例的订单对象呢?这让我很困惑...... OrderDao 将无法返回一个订单实例,因为这个实例需要一个支付实例......我可以做一些“技巧”,比如 OrderDao 返回一个实例,其支付初始化为只有它的 id,然后在业务逻辑中,

这应该怎么做?

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

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

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

提前致谢。

4

2 回答 2

3

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

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

高温高压

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;
        }
}
于 2012-08-30T09:20:18.133 回答
1

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

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

于 2012-08-30T11:32:41.970 回答