Hibernate日期字段在当天具有唯一约束

时间:2011-03-21 13:23:38

标签: hibernate postgresql date annotations constraints

我目前正在实施一个历史报告商店,用户每天只能存储1个报告。我们正在尝试应用唯一约束,但我们正在努力创建日期降至毫秒级分辨率。无论如何,只有在Hibernate中的Date字段的日期应用约束而不必下拉以直接在我们的底层Postgres DB中应用约束?

目前无效的代码如下:

@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 个答案:

答案 0 :(得分:2)

你试过试试吗? @Temporal(TemporalType.DATE) 在createdDate?我认为注释会告诉Hibernate生成一个Date列(而不是一个持有完整时间戳的列)。

答案 1 :(得分:1)

你可以

  • 在Hibernate映射中将StarShip3000建议的索引插入database-object
  • 将另一个属性添加到私有类并将其映射到数据库的唯一字段,并仅返回创建日期。如果您还需要创建时间,请实现一个空的setter。
  • 将字段映射到仅存储日期的数据库数据类型(我不知道postgres,但假设存在这样的数据类型)。如果您不需要创建时间,那就是您所需要的一切。

答案 2 :(得分:0)

我不知道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