我应该在哪里放置以下方法?

时间:2011-10-20 04:55:27

标签: java sql dao api-design

我有2个关系表:

Purchase 1:m Payment
  • 每次购买都有一个主键“purchaseId”。
  • 每笔付款都有一个主键“transactionId”和一个外键“purchaseId”;

我为每个表都有一个DAO类。现在我想实现一个函数

List<Payment> findPaymentsByPurchaseId(int purchaseId)

为了让API感觉更直观,我应该将此功能放在

  1. PurchaseDAO表示“如果我想根据购买信息找到任何东西,我只需在PurchaseDAO中调用一个函数”
  2. PaymentDAO表示“如果我想查找付款信息,我只需在PaymentDAO中拨打电话”
  3. 你觉得哪一个更直观?

3 个答案:

答案 0 :(得分:3)

我将它放在PaymentDAO中,因为它正在返还付款,但我也会让它更通用

List<Payment> findByPurchase(Purchase purchase)

答案 1 :(得分:1)

可能会有多个地方。

在购买DAO中,您需要:

List<Payment> getPaymentsFor(Purchase) // or find..., or findByPurchase, or...

在付款DAO中,您需要:

Purchase getPurchaseFor(Payment)

(无论是ID还是对象更具哲学性而不是技术性;使用任何适用于你的东西。暴露ID可能被视为漏洞抽象,虽然它更像是认知的,因为拥有PK并不意味着< em>必须是一个数据库PK,它可能只是一个GUID。)

答案 2 :(得分:0)

购买'了解'它的付款 - 所以问它。又名'别叫我,我会叫你'

我个人创建一个类层次结构,如

Purchases
Purchase 
PurchaseDAO

Payments 
Payment
PaymentDAO


Purchases purchases = Purchases.find(criteria); 
// user selects one of the purchases (say)
Purchase = purchase.load(purchaseId);
// calls 
PurchaseDAO.load(purchaseId);
// which calls
Payments payment = Purchase.findPayments(); 
// calls 
Payments.find(purchaseId);
// calls 
PaymentDAO.find(purchaseId);

最后,您将拥有一个可以查询其付款的购买对象。 如果可能会有很多针对购买的付款,您可以在需要之前推迟付款。

这似乎是额外的工作(并且是),但它允许清晰地分离业务和持久性逻辑,我发现回报创建额外类的小额投资。