在Customer类中存储当前选定的付款信息

时间:2011-09-19 16:55:40

标签: java jpa payment

我需要存储customer当前选择的payment信息,以便此信息可用于处理购买。客户可以拥有多张信用卡。所以我将其建模为{ {1}}关系。我怀疑将当前选定的付款信息存储为不同的字段(如下所示)。并排显示OneToManySet<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

}

1 个答案:

答案 0 :(得分:2)

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

如果您使用的是套装,则无需使用:

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

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

此外,我没有理由这样做:

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

你可以设置它,而不需要评估currentSelectedPayment是否不相等。

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

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