2011-09-19 2 views
0

customer의 현재 선택된 payment 정보를 저장해야 구매 정보를 사용할 수 있습니다. 고객이 많은 신용 카드를 보유 할 수 있으므로 OneToMany으로 모델링했습니다. 현재 선택된 결제 정보를 다른 필드 (아래 참조)로 저장하는 것에 대해 의문의 여지가 있습니다. Set<Payment>Payment 필드를 나란히 놓으면 모양이 올바르지 않게 보입니다. 고객 분류에 현재 선택된 결제 정보를 저장합니다

이 현재 선택된 카드 정보는 내가

로 비즈니스 로직을 구현

@Entity 
class Customer{ 
... 
@OneToMany(cascade=CascadeType.ALL,orphanRemoval=true) 
Set<Payment> payments; 

Payment currentlySelectedPayment;//? 

} 

@Entity 
@Table([email protected](columnNames={"cardType","cardNumber"})) 
public class Payment{ 
... 
    String cardType; 
    String cardNumber; 
    String nameOnCard; 
    ... 
    Date dateOfExpiry;//day,month,year of expiry 

} 

것을 표시하기 위해 몇 가지 플래그를 사용 할 수 있습니까?이 할 수있는 더 좋은 방법이 있나요

void addNewCard(...){ 
    Payment payment = get_from_db_or_create_new_payment(...); 
    if(!customer.getPayments().contains(payment)){ 
     customer.getPayments().add(payment); 
    } 
... 
} 

void setCurrentlySelectedPaymentForCustomer(Long paymentId,..){ 
    Payment payment = getPaymentFromDB(paymentId); 
    if(!customer.getCurrentlySelectedPayment().equals(payment)){ 
     customer.setCurrentlySelectedPayment(payment); 
    } 
... 
} 

답변

2

I 돈 디자인에 문제가 없는지 확인하십시오. 지불 세트에 지불을 추가해야합니다. 그런 다음 선택한 지불을 고객에게 지정해야합니다.

당신이 사용할 필요가 없습니다 세트를 사용하는 경우

if(!customer.getPayments().contains(payment)){ 

을 Set를 중복 요소를 추가 허용하지 않기 때문에.

if(!customer.getCurrentlySelectedPayment().equals(payment)){ 

당신은 단지 그것을 설정할 수 있고 currentlySelectedPayment이 동일하지 않은 경우 평가 할 필요가 없습니다 :

또한 나는이 작업을 수행 할 이유가 표시되지 않습니다.

부모에게 요소를 먼저 추가 한 다음 해당 요소 중 하나를 부모의 특성 중 하나에 할당해야하는 비슷한 상황이 발생했습니다. 내가 해결 한 방법은 자식에 플래그 (true/false 속성) 대신에 수행 한 방법입니다.

나는 당신이하고있는 방식이 올바른 방법이라고 생각합니다. 예를 들어,이 경우의 플래그는 selectedPayment이라는 속성이 해당 오브젝트에 대한 적절한 속성이 아님을 알 수 있습니다. 왜? 첫 번째는 고객의 속성이지 지불 자체는 아닙니다. 둘째, selectedPayment를 변경하려는 경우 하위 오브젝트에서 selectedPayment를 가져와야하며, 플래그를 삭제하고 플래그를 새 하위에 지정하십시오. 상위에 속성을 작성한 경우 피할 수 있었던 많은 단계가 있습니다.