我需要存储customer
当前选择的payment
信息,以便此信息可用于处理购买。客户可以拥有多张信用卡。所以我将其建模为{ {1}}关系。我怀疑将当前选定的付款信息存储为不同的字段(如下所示)。并排显示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
}
答案 0 :(得分:2)
我认为设计没有任何问题。您需要将付款添加到付款集。之后,您需要将所选付款分配给客户。
如果您使用的是套装,则无需使用:
if(!customer.getPayments().contains(payment) ){
因为Set不允许添加重复的元素。
此外,我没有理由这样做:
if(!customer.getCurrentlySelectedPayment().equals(payment)){
你可以设置它,而不需要评估currentSelectedPayment是否不相等。
我遇到过类似的情况,你需要先将元素添加到父元素中,然后将其中一个元素分配给父元素之一。我解决它的方式是你做的方式,而不是在孩子们有一个标志(真/假属性)。
我认为你这样做是正确的方法。我认为在这种情况下,例如在Payment中名为 selectedPayment 的属性的标志不是该对象的适当属性。为什么?因为first是Customer的属性而不是Payment本身。第二,当您想要更改selectedPayment时,您需要从子对象获取selectedPayment,删除该标志并将该标志分配给新子项,如果您只是在父项中创建属性,则可以避免许多步骤。 / p>