Hibernate UniqueConstraint

时间:2013-07-26 19:45:05

标签: java hibernate

例如,我有一些实体,如:

@Entity
public class WorkingScheduleOverride implements Serializable {

    private static final long serialVersionUID = 1L;

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

    @Version
    private Integer version;

    @Column
    private Date validFrom;

    @Column
    private Date validThru;

    @Column
    private Date timestamp;

    @Column(unique = true)
    private Date date;

要按字段日期检查实体是否唯一,我添加了(unique = true)。这样可以正常工作,但前提是不要对实体使用“可关闭”方法。如果您想跟踪这些对象的历史记录,则适用于这种情况。所以我使用'validThru'字段指定实体有效的时间。

所以我的问题是:是否可以使用任何自定义验证/注释来检查唯一性仅有效实体(validThru == null || validThru < new Date())

数据库中的数据不正确(两条记录的日期相同且都有效):

-----------------------------------------------------------------
id  |version    |timestamp  |valid_from |valid_thru |date       |
-----------------------------------------------------------------
1   |1          |2012-01-01 |2012-01-01 |null       |2013-01-01 |
-----------------------------------------------------------------
2   |1          |2012-01-01 |2012-01-01 |null       |2013-01-01 |
-----------------------------------------------------------------

更正数据库中的数据(两条记录的日期相同但第二条记录无效):

-----------------------------------------------------------------
id  |version    |timestamp  |valid_from |valid_thru |date       |
-----------------------------------------------------------------
1   |1          |2012-01-01 |2012-01-01 |null       |2013-01-01 |
-----------------------------------------------------------------
2   |1          |2012-01-01 |2012-01-01 |2012-06-01 |2013-01-01 |
-----------------------------------------------------------------

数据库中的数据不正确(两条记录的日期相同且均有效,第二条记录仅在2014年1月1日失效):

-----------------------------------------------------------------
id  |version    |timestamp  |valid_from |valid_thru |date       |
-----------------------------------------------------------------
1   |1          |2012-01-01 |2012-01-01 |null       |2013-01-01 |
-----------------------------------------------------------------
2   |1          |2012-01-01 |2012-01-01 |2014-01-01 |2013-01-01 |
-----------------------------------------------------------------

由于

2 个答案:

答案 0 :(得分:0)

我不确定理解你的问题但是。

@PreUpdate
@PrePersist
public void checkEntity() {
    if ( validThru != null && validThru.getTime() > new Date().getTime() ) {
        throw new SomeException("Invalid entity");
    }
}

可以胜任。


当您使用unique=true时,约束不在代码级别,它处于数据库级别。如果要确保更高级的约束,请创建一个拒绝插入和更新的触发器。

如果无法对触发器进行编码,则必须使用应用代码强制实体一致性。创建一个save(entity)的服务,该服务将拒绝具有异常的错误实体。

答案 1 :(得分:0)

而不是日期,您可以在verion和id上使用TimeStamp.and唯一列约束。因此,您的记录可能是唯一的任何情况。                                     另一种可以将状态用作列的方法其中,praticular记录Valid-V和Invalid -I.you只能根据选择显示有效或无效的记录

相关问题