Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / [Hibernate] Автогенерация даты создания рекорда / 3 сообщений из 3, страница 1 из 1
09.11.2012, 22:37:37
    #38032602
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Автогенерация даты создания рекорда
Как-то руки не доходили до этого, всегда генерил и заполнял поле сам. Тут решил разобраться.

В основном источники демонстрируют простой и лаконичный вариант:
Код: java
1.
2.
3.
4.
@Column(name = "created", updatable = false, nullable = false)
@Temporal(value = TemporalType.TIMESTAMP)
@Generated(value = GenerationTime.INSERT)
private Date created;



К сожалению, так при создании выпадает исключение о том, что я вставляю NULL-значение. Убирая "nullable = false" (... и надеясь, что это может как-то-там и как-то-так вставит время), просто получаем NULL в рассматриваемом поле.

Замечательным решение выглядит использование аннотации @PrePersist. Однако я использую Session API, а не EntityManager (кажется, так это называется), а заморачиваться с интерцепторами неохота.

При рассмотрении данного вопроса наталкивался на использование аннотации @Version. И хотя в общих чертах понимаю назначение всех используемых аннотаций JPA и Hibernate, но вот то, что все сразу заработало, меня слегка ставит в тупик ...
Код: java
1.
2.
3.
4.
@Version
@Column(name = "created", updatable = false, nullable = false)
@Temporal(value = TemporalType.TIMESTAMP)
private Date created;



В принципе, замечательно работает. Правда, немного омрачает то, что при любом обновлении рекорда Хибер хочет обновить поле created и только атрибут "updatable = false" его сдерживает. Почему заработало, об этом стыдно спрашивать, поэтому не буду (почитаю чуток больше об оптимистических блокировках), а вот почему не работает первый способ? - это вопрос ...
...
Рейтинг: 0 / 0
09.11.2012, 23:13:09
    #38032621
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Автогенерация даты создания рекорда
Вот открыл мануал, почитал про эти аннотации за тебя. Generated нужен когда база данных генерит значения для свойства. Хибер сам его генерить не будет. Т.е. должен быть триггер. Хибер сделает instert и перечитает из записи сгенеренное значение .
Триггера у тебя видать не было?
Оптимистичный же лок реализован самим хибером. Вот он по Version и генерить timestamp.
...
Рейтинг: 0 / 0
10.11.2012, 00:06:31
    #38032642
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Hibernate] Автогенерация даты создания рекорда
Спасибо. 3 десятка слов и сразу все стало понятно, хотя доку я тоже читал ))
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / [Hibernate] Автогенерация даты создания рекорда / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]