2014-11-04 3 views
1

У меня есть модель, как это:JPA - сохранение @version, как тип данных длинного

@Entity 
public class Event extends Model { 
    @Id 
    public long id; 

    public String name; 

    @Version 
    public Timestamp created; 
} 

При запуске .save() на этом объекте, я получаю следующую запись:

id | name |   created 
----+--------+------------------------- 
    1 | Foobar | 2014-11-04 20:25:40.194 

Как вы можете видеть, поле created в формате SQL Timestamp. Можно ли изменить это как фактический тип данных BIGINT или long? Простое изменение created к public long дает погрешность:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.sql.Timestamp 

ответ

2

Согласно JPA 2.0 Спецификация, глава 11.1.50 Версия Аннотация:

The following types are supported for version properties: int, Integer, short, Short, long, Long, Timestamp.

  • , если это возможно отказаться от существующей схемы базы данных, то это было бы достаточно, чтобы заменить поле объекта java.lang.Long и снова создать схему базы данных, поэтому соответствующий столбец базы данных будет заменен на длинный.

  • , если это не представляется возможным отказаться от существующей схемы базы данных (то есть наследие базы данных), то предприятие может сделать явное преобразование на месте от java.lang.Long к java.sql.Timestamp с макияжем использованием конструктора:

    Timestamp created = new Timestamp(1397240740194L); //2014-11-04 20:25:40.194 
    Long timestamp = created.getTime(); 
    

    Я бы не рекомендовал использовать java.math.BigInteger по соображениям производительности, если это действительно необходимо (какой-либо прецедент?).


Примечание стороны:

In general, fields or properties that are specified with the Version annotation should not be updated by the application.

Другими словами, контекст сохранения заботится о обновлении версии поля/колонки. Приложение должно позаботиться об этом только в случае массовых обновлений, когда контекст персистентности опущен, а оптимистичные проверки блокировки обойдены.

+0

Удаление базы данных не является проблемой. Я изменил модель, чтобы использовать '@Version public Long created', но это поле теперь заполняется' 1' для каждой записи, а не что-то вроде 'System.getCurrentTimeMillis()'. Есть идеи? – doque

+0

Общее правило: каждый раз, когда объект обновляется в базовой базе данных, его поле версии увеличивается на единицу. Попробуйте обновить существующий объект и вызвать flush/commit. – wypieprz

Смежные вопросы