Поле даты гибернации с уникальным ограничением на день - PullRequest
0 голосов
/ 21 марта 2011

В настоящее время я создаю хранилище исторических отчетов, в котором пользователи будут хранить только 1 отчет в день.Мы пытаемся применить уникальные ограничения, но мы изо всех сил пытаемся, поскольку созданная дата снижается до миллисекунд.Есть ли в любом случае применить ограничение только к дню поля Date в Hibernate, не выпадающий из-под него, чтобы применить ограничение непосредственно в нашей базовой базе данных Postgres?

Код, который в настоящее время не работает, выглядит следующим образом:

@Entity
@Table(name = "report", uniqueConstraints = @UniqueConstraint(columnNames={"createdDate", "name"})) 
public class Report {

  @Column
  private Date createdDate

  @Column   
  private String name;

  @Id   
  @GeneratedValue(strategy = GenerationType.SEQUENCE)   
  private Long id;

}

Ответы [ 3 ]

2 голосов
/ 21 марта 2011

Вы пытались поместить @Temporal (TemporalType.DATE) в созданную дату?Я думаю, что аннотация скажет Hibernate создать столбец Date (вместо одного, содержащего полную метку времени).

1 голос
/ 21 марта 2011

Вы могли бы

  • Вставьте индекс, предложенный StarShip3000, в качестве объекта базы данных в отображениях Hibernate
  • Добавьте еще одно свойство к классу, который является частным и сопоставлен с базой данных уникальному полю и возвращает только дату создания. Если вам также нужно время создания, реализуйте пустой сеттер.
  • Сопоставить поле с типом данных базы данных, в котором хранятся только даты (я не знаю postgres, но предполагаю, что существует такой тип данных). Если вам не нужно время создания, это все, что вам нужно.
0 голосов
/ 21 марта 2011

Я не знаю hibernate, но вы можете создать это ограничение непосредственно для таблицы базы данных, используя старый добрый простой SQL.

Например:

CREATE UNIQUE INDEX uidx_report_name_create_date ON report (name,date_trunc('day', create_date));



select date_trunc('day', TIMESTAMP '2001-02-16 20:38:40');

RETURNS 2001-02-16 00:00:00

select date_trunc('day', TIMESTAMP '2001-02-16 10:38:40');

RETURNS 2001-02-16 00:00:00
...