сохранение выбранной информации о платеже в классе Customer - PullRequest
0 голосов
/ 19 сентября 2011

Мне нужно сохранить информацию customer, выбранную в данный момент payment, чтобы ее можно было использовать при обработке покупки. У клиента может быть много кредитных карт. Поэтому я смоделировал это как отношение OneToMany. Я сомневаюсь, что информация о выбранном платеже будет сохранена в другом поле (как показано ниже). Если рядом расположено поле Set<Payment> и Payment, то выглядит не совсем правильно.

Есть ли лучший способ сделать это? Может быть, используйте какой-нибудь флаг, чтобы отметить, что это текущая выбранная информация о карте

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

Payment currentlySelectedPayment;//?

}

@Entity
@Table(uniqueConstraints=@UniqueConstraint(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);
    }
...
}

1 Ответ

2 голосов
/ 19 сентября 2011

Не вижу проблем с дизайном. Вам необходимо добавить платеж в набор платежей. После этого вам необходимо назначить выбранный платеж Клиенту.

Если вы используете набор, вам не нужно использовать:

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

потому что набор не позволяет добавлять дубликаты элементов.

Также я не вижу причин для этого:

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

Вы можете просто установить его, и вам не нужно оценивать, если текущая выбранная оплата не равна.

Я сталкивался с похожими ситуациями, когда вам нужно сначала добавить элементы к родителю, а затем назначить один из этих элементов одному из атрибутов родителя. Я решил это так, как вы сделали, вместо того, чтобы иметь флаг (атрибут true / false) в childs.

Я думаю, то, что вы делаете, это правильный путь. Я думаю, что флаг, такой как, например, в этом случае атрибут с именем selectedPayment в поле Payment, не является подходящим атрибутом для объекта. Зачем? Потому что сначала это атрибут Клиента, а не сам Платеж. Во-вторых, когда вы хотите изменить selectedPayment, вам нужно получить selectedPayment из дочернего объекта, удалить флаг и назначить флаг новому дочернему элементу, чего можно было бы избежать, если бы вы просто создали атрибут в родительском объекте.

...