【问题标题】:storing currently selected payment info in Customer class在 Customer 类中存储当前选择的付款信息
【发布时间】:2011-11-20 10:20:45
【问题描述】:

我需要存储一个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);
    }
...
}

【问题讨论】:

    标签: java jpa payment


    【解决方案1】:

    我认为设计没有任何问题。您需要将付款添加到付款集。之后,您需要将选定的付款分配给客户。

    如果您使用的是不需要使用的集合:

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

    因为 Set 不允许添加重复的元素。

    我也没有理由这样做:

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

    如果currentSelectedPayment不相等,你可以设置它,不需要评估。

    我遇到过类似的情况,您需要先将元素添加到父元素,然后将其中一个元素分配给父元素的属性之一。我解决它的方式是你做的方式,而不是在孩子中有一个标志(真/假属性)。

    我认为您的做法是正确的做法。我认为,例如在这种情况下,Payment 中名为 selectedPayment 的属性不是该对象的适当属性。为什么?因为 first 是 Customer 的属性,而不是 Payment 本身。其次,当您想要更改 selectedPayment 时,您需要从子对象获取 selectedPayment,删除标志并将标志分配给新的子对象,如果您只是在父对象中创建属性,则可以避免许多步骤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-22
      • 2012-08-15
      • 1970-01-01
      • 2018-04-21
      • 2013-01-05
      • 2014-12-08
      • 2012-05-21
      • 2013-02-19
      相关资源
      最近更新 更多