1

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

@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”字段来指定实体有效的时间。

所以我的问题是:是否可以通过使用任何自定义验证/注释来检查唯一性ONLY VALID entity (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 |
-----------------------------------------------------------------

谢谢

4

2 回答 2

0

我不确定你的问题,但是。

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

可以做这项工作。


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

如果无法对触发器进行编码,则必须强制实体与应用代码保持一致。创建一个服务,该服务save(entity)将拒绝不良实体并出现异常。

于 2013-07-27T02:19:01.707 回答
0

代替日期,您可以使用 TimeStamp.and 对 verion 和 id 的唯一列约束。这样您的记录的任何情况都可以是唯一的。另一种可以将状态用作列的方法,其中实际记录有效-V 和无效-I。您可以根据选择仅显示有效或无效记录

于 2014-10-14T12:49:14.933 回答