4

ここには大きな設計上の欠陥がありますが、私はそれを解決するのに苦労しています:

ビジネスニーズは少し複雑なので、これをシンプルに保つようにします。購入のテーブルと返品のテーブルがあります。返品が行われた場合、データベース内で最も古い購入に返品する一致を見つけて、「返品が適用された」テーブルに記録する必要があります。

したがって、返品を挿入するときは、そのトランザクション内で、返品を購入レコードに適用する必要があります。

現在のところ、挿入用のリポジトリを呼び出すサービスがあります。サービスは、挿入されたレコードのキーが何であるかを知る必要があります。これにより、サービスは、そのキーを使用して「適用された」レコードを挿入することでトランザクションを終了できます。

リポジトリがこの種のデータを返すべきではないというのが私の理解であるため、基本的に行き詰まっています。これは、リポジトリがコレクションであるという考えを打ち負かしませんか?

代替手段は何ですか?

明確化:

Purchaseテーブル、Returnテーブル、およびAppliedテーブルがあります。

適用されたテーブルは次のようになりますpurchaseIdreturnIdqtyReturned

したがって、返品が挿入されるときは、購入のID(いくつかのビジネスルールによって決定されます)と新しく挿入された返品のIDが必要です。

4

1 に答える 1

1

あなたの質問によると、私は次のように思います:

public class Purchase {

   // ReturnRepository plays the role of collaborator
   public Return returnMe(PurchaseRepository purchaseRepository, int quantity) {
       return purchaseRepository.returnPurchase(this, quantity);
   }

}


public class PurchaseRepositoryImpl implements PurchaseRepository {

    // returnd Purchase object has its id set up
    public Purchase getOldestPurchase() {
        // logic in order to get oldest purchase
    }

    public Return returnPurchase(Purchase purchase, quantity) {
        // logic in order to save a return record
        // Some ORM frameworks returns ids when a record is saved. In my case, Hibernate or NHibernate (.NET) fulfill ths requirement

        // Then purchaseId, returnId and quantity is saved in "returns applied" table
    }

}


public class PurchaseServiceImpl implements PurchaseService {

   // Injected through dependency injection
   private PurchaseRepository purchaseRepository;

   // Spring transaction boundary, for example
   // Notice returnPurchase method returns a Return object
   public Return returnPurchase(int quantity) {
       Purchase purchase = purchaseRepository.getOldestPurchase();

       return purchase.returnMe(purchaseRepository, quantity);
   }

}
于 2009-07-10T05:14:28.247 に答える