Playframework2:Ebean和OptimisticLockException

时间:2012-12-22 00:05:05

标签: playframework-2.0 ebean

我遇到了Ebean和更新的问题。我需要的一切都是这样的:

public static Result cancelOrder(Long id){
Order order = Order.findByID(id);
if(order != null){
    order.canceled = true;
    order.update(id);
}
return OK();
}

我的模特:

@Entity 
@Table(name="order")
public class Order extends Model {
    @Id
    @Column(name="ID")
    public long id;

    @Constraints.Required
    public String date;

    @Constraints.Required
    public String name;

    public Boolean canceled;

    public Order(String date, String name){
         this.date = date;
         this.name = name;
    }
    public static Model.Finder<String,Order> find = new Model.Finder(String.class, Order.class);

    public static Order findByID(long id) {
        return find.where().eq("ID", id).findUnique();
    }
}

但它不起作用因为我得到异常“OptimisticLockException:数据已更改。更新[0]行”。我发现了一些类似的问题,但一切都是关于形式但不是这样的。你能帮助我吗?谢谢

2 个答案:

答案 0 :(得分:0)

遇到同样的问题。

ebean以奇怪的方式构建更新查询,而不只是使用“WHERE id =?”但是“WHERE id =?AND field1 =?AND blabla”。 如果表中有一个浮点字段,那么mysql怪癖就会启动,即使float_field为0.1,它也不会总是返回true,它是近似值:/

因此,一种解决方案是将浮点字段转换为十进制。

另一个解决方案是让ebean仅使用@Id构建更新查询...无法弄清楚如何,甚至是否可能......

答案 1 :(得分:0)

我使用Float数据类型时遇到了类似的问题。我只在DB中更改为Decimal数据类型,并使用@Column表示法定义了长度:

@Column(columnDefinition =“Decimal(10,3)”)     public Float示例;

......而且有效。