2011-09-19 13 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

我不沒有看到任何設計問題。您需要將付款添加到付款集。之後,您需要將選定的付款分配給客戶。

如果您使用的是一套,你不需要使用:

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

因爲set不允許添加重複的元素。

此外,我不明白了一個道理這樣做:

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

你可以設置它,不需要評估,如果currentlySelectedPayment是不相等的。

我遇到過類似的情況,需要先將元素添加到父級,然後將其中一個元素指定給父級的某個屬性。我解決這個問題的方式是你做的,而不是在孩子中有一個標誌(真/假屬性)。

我認爲你這樣做的方式是正確的做法。我認爲一個標誌,例如在這種情況下,名爲selectedPayment的Payment屬性不是該對象的適當屬性。爲什麼?因爲首先是客戶的屬性,而不是支付本身。其次,當您想更改selectedPayment時,您需要從子對象獲取selectedPayment,刪除該標誌並將標誌分配給新的子項,如果您只是在父項中創建屬性,則可以避免許多步驟。

相關問題