我正在开发一个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表,每个表记录在类别表中,会有一些语言的相应翻译..
提前致谢。
答案 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将是独立的,您将获得所需的功能。