我需要存储 customer
当前选择 payment
info ,以便该信息可以用于处理购买。客户可以拥有许多信用卡。所以我将其建模为 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);
}
...
}
最佳答案
我没有发现设计有任何问题。您需要将付款添加到付款集中。之后,您需要将所选付款分配给客户。
如果您使用的是一套,则不需要使用:
if(!customer.getPayments().contains(payment) ){
因为 Set 不允许添加重复的元素。
而且我看不出这样做的理由:
if(!customer.getCurrentlySelectedPayment().equals(payment)){
您可以只设置它,不需要评估当前SelectedPayment是否不相等。
我遇到过类似的情况,您需要首先将元素添加到父级,然后将这些元素之一分配给父级的属性之一。我解决这个问题的方法就是你的方法,而不是在子项中使用标志(true/false 属性)。
我认为你这样做的方式是正确的。我认为像本例中付款中名为 selectedPayment 的属性这样的标志不是该对象的适当属性。为什么?因为首先是客户的属性,而不是付款本身。其次,当您想要更改 selectedPayment 时,您需要从子对象获取 selectedPayment,删除标志并将标志分配给新的子对象,如果您只在父对象中创建属性,则可以避免许多步骤。
关于java - 将当前选择的付款信息存储在客户类别中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7474517/