java - playframework 模型未正确保存

标签 java playframework

在我的 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/

相关文章:

java - 如何仅在特定年份运行 Spring 预定工作?

java - 如何修复 Intellij 中未设置的 TERM 环境?

java : read/write neo4j server database

java - 来自 Postgresql 的类型和来自 Play 的类型 (anorm)

Scala AKKA 访问变量或返回值

java - 确定对象的类型

java - 如何在ipad上运行Servlet

scala - 在play scala中传递请求参数

playframework - 使用支持WebSocket的浏览器进行集成测试

scala - 如何在 Play Framework 2.2.1 中读取文件?