문제

여기에는 큰 디자인 결함이 있지만 해결하는 데 어려움이 있습니다.

비즈니스 요구는 약간 관련되어 있으므로 이것을 간단하게 유지하려고 노력할 것입니다. 구매가있는 테이블과 반품 테이블이 있습니다. 반품이 이루어지면 DB에서 가장 오래된 구매로 돌아가는 일치를 찾아서 "반품 응용 프로그램"테이블에 기록해야합니다.

따라서 반품을 삽입하면 해당 거래 내에서 반품을 구매 기록에 적용해야합니다.

현재 서있는 것처럼 삽입 용 저장소를 호출하는 서비스가 있습니다. 서비스는 삽입 된 레코드의 키가 무엇인지 알아야하므로 해당 키를 사용하여 "적용된"레코드를 삽입하여 트랜잭션을 완료 할 수 있습니다.

저의 이해는 저장소가 이런 종류의 데이터를 반환해서는 안된다는 것이 기본적으로 고착되어 있습니다. 이것이 저장소가 컬렉션이라는 아이디어를 물리 치지 않습니까?

대안은 무엇입니까?

설명:

구매 테이블, 반품 테이블 및 응용 테이블이 있습니다.

적용된 테이블은이 PuudureId returnid Qtyreturned처럼 보입니다

따라서 돌아올 때 삽입 구매의 ID (일부 비즈니스 규칙에 따라 결정)와 새로 삽입 된 반품의 ID가 필요합니다.

도움이 되었습니까?

해결책

귀하의 질문에 따라 다음을 생각합니다.

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

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top