Playframework2: Ebean и OptimisticLockException

У меня проблема с 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] строк». Я нашел несколько похожих проблем, но все было о формах, но ничего подобного. Вы можете помочь мне? Спасибо


person Marek Čačko    schedule 22.12.2012    source источник
comment
Пожалуйста, покажите update() метод вашего Order класса.   -  person ndeverge    schedule 22.12.2012
comment
У меня нет собственного обновления(). Я использую по умолчанию, расширяя Model.   -  person Marek Čačko    schedule 22.12.2012
comment
Ваш код выглядит довольно нормально, можете ли вы показать нам больше (полного) кода? может быть, есть какая-то другая досадная ошибка, что-то о типе или что-то в этом роде.   -  person biesior    schedule 22.12.2012


Ответы (2)


Имея ту же проблему.

Что происходит, так это то, что ebean создает запрос на обновление странным образом, а не просто использует «WHERE id =?» но "ГДЕ id = ? И field1 = ? И блабла". И если у вас есть поле с плавающей запятой в таблице, тогда в дело вступают причуды mysql, float_field = 0,1 не всегда возвращает true, даже если float_field IS 0,1, это приблизительное значение:/

Таким образом, одним из решений является преобразование полей с плавающей запятой в десятичные числа.

Другое решение - заставить ebean создавать запросы на обновление, используя только @Id... Не могу понять, как и даже возможно ли это...

person Boris Churzin    schedule 20.03.2013

У меня была аналогичная проблема с использованием типа данных Float. Я изменил тип данных Decimal только в БД и определил длину, используя нотацию @Column:

@Column(columnDefinition = "Decimal(10,3)") общедоступный пример с плавающей запятой;

... И это работает.

person Sebastián Vásquez    schedule 05.03.2015