Как сопоставить столбец отметки времени с типом JPA? - PullRequest
8 голосов
/ 16 декабря 2011

Я использую Play! 1.2.4 и PostgreSQL 9.1. Я создал таблицу со столбцом created_at типа: timestamp without time zone. Он имеет значение по умолчанию now().

Проблема возникает, когда я выбираю данные, используя класс Entity для этой таблицы. Поле createdAt всегда возвращается null. Вот определение поля:

@Column(name="created_at", insertable=false)
public java.sql.Date createdAt;

Все остальные поля заполнены правильно. Я попытался изменить тип поля на Date, Calendar, Timestamp и т. Д. И попытался добавить аннотацию @Timestamp. Но ни одна комбинация не оказалась успешной.

Заранее спасибо за любую помощь!

Для справки, вот DDL, который я использовал для создания таблицы.

CREATE TABLE Users
(
  id serial     NOT NULL,
  username text NOT NULL,
  email text    NOT NULL,
  password_hash text NOT NULL DEFAULT 0,
  created_at timestamp without time zone DEFAULT now(),
  CONSTRAINT Users_pkey PRIMARY KEY (id),
  CONSTRAINT Users_username_key UNIQUE (username)
);

Обновление: Я думаю, что проблема связана с использованием JPA для вставки записи. База данных заполняет значение по умолчанию now() для created_at, но каким-то образом Hibernate не знает об этом при извлечении этой строки.

Если я запрашиваю уже существующую строку, поле createdAt заполняется правильно! ОК ... это сужает проблему.

Ответы [ 3 ]

15 голосов
/ 16 декабря 2011

Я точно не решил проблему, но я обошел ее.

Вместо того, чтобы база данных предоставляла значение по умолчанию now(), я выразил его в JPA с @PrePersist:

@Column(name="created_at", nullable=false)
@Temporal(TemporalType.TIMESTAMP)
public Date createdAt;

@PrePersist
protected void onCreate() {
    createdAt = new Date();
}

Это отлично работает! Вдохновение взято из этого ответа . Я до сих пор не уверен, почему Hibernate не обновился со значением по умолчанию, которое было применено в базе данных. Он застрял, думая, что значение по-прежнему равно нулю.

2 голосов
/ 16 декабря 2011

Попробуйте это:

@Column(name="create_at", insertable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date createAt;
0 голосов
/ 11 июня 2018

Вам нужно отсоединить и извлечь сущность из БД.Оператор вставки не содержит поля create_at, поэтому он не управляется JPA во время создания.В репозитории это будет выглядеть так:

@Transactional
public Log save(Log log) {
    this.em.persist(log);
    this.em.detach(log);
    return this.em.find(Log.class, log.getId());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...