在我的 play1.2.4
应用程序中,我有一个客户
,他可以拥有PaymentMethod
的集
。I尝试像下面一样对其进行建模,并在 Controller 中编写方法以将 PaymentMethod 添加到 Customer. payments。
但是,这些方法给出了奇怪的结果。添加付款后,customer. payments 集正确显示为增加 1 个元素。然后,当我转到另一个 Controller 方法来显示 Customer 的 paymentMethods 时,它说客户.付款为空。
我不明白为什么会发生这种情况。有人可以帮我纠正这个问题吗?
Customer.java:
@Entity
class Customer extends Model{
...
@OneToMany(mappedBy="customer",cascade=CascadeType.ALL)
public Set<PaymentMethod> payments;
public Customer(){
...
payments = new HashSet<PaymentMethod>();
}
}
PaymentMethod.java
@Entity
class PaymentMethod extends Model{
...
@ManyToOne
public Customer customer;
}
Controller 方法
public static void addNewPaymentMethod(Long custId,...){
Customer customer = Customer.findById(custId);
PaymentMethod payment = findOrCreateNewPayment(...);//if already in db get it or create a new one
customer.payments.add(payment);
customer.save();
System.out.println("customer has:"+customer.payments.size()+" payments");
showPaymentForm(custId);
}
//这里控制台输出是: 客户有: 1 笔付款
编辑:findOrCreateNewPayment方法是:
PaymentMethod findOrCreateNewPayment(Customer customer,String paymentNumber,...){
String query = "select distinct p from PaymentMethod p where p.customer=:customer and and p.paymentNumber=:paymentNumber...";//other fields omitted for brevity
PaymentMethod payment = PaymentMethod.find(query).bind("customer", customer).bind("paymentNumber", paymentNumber)...first();//other bind params omitted for brevity
if(payment == null){
payment = new PaymentMethod(paymentNumber,month,name,day,type);
payment.save();
}
return payment;
}
但是,showPaymentForm() 告诉我客户没有任何付款!
showPaymentForm(Long custId){
Customer customer = Customer.findById(custId);
System.out.println("showPaymentForm():: customer has ="+customer.payments.size()+" payments");
...
render(customer);
}
控制台输出是:
客户有:0 笔付款
另外,当我检查付款表时,我发现
*id |付款类型 |付款号码 |月 |名称 |年 | customer_id*
28 |付款方式1 | 1111XXXXXX2222 | 11 | 11乔恩 | 2027 | 2027
该表中的 customer_id 字段应该有一个客户编号,但为空。看来 Controller 中的 customer.save() 没有提交..
为什么会发生这种情况?有人可以告诉吗?...任何帮助表示赞赏。
最佳答案
当您创建新的 PaymentMethod 时,客户是否在保存之前设置了该对象?所以像这样:
Customer someCustomer = ...
new PaymentMethod(someType, someNumber, someMonth, someName, someYear, someCustomer).save();
此外,如果您希望客户与 PaymentMethod 关联,您可能需要使 Customer 字段不可为空:
@Entity
public class PaymentMethod extends Model {
...
@Column(nullable = false)
@ManyToOne
public Customer customer;
}
关于java - playframework 模型未正确保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9495033/