2013-07-26 48 views
1

例如我有一些实体,如:休眠的UniqueConstraint

@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; 

要检查该实体是由场日期我加入(唯一=真)唯一的。这可以正常工作,但前提是不要对实体使用“可关闭”方法。如果你想跟踪这些对象的历史,这是为了这种情况。所以我使用'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号):

----------------------------------------------------------------- 
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 | 
----------------------------------------------------------------- 

谢谢

+0

查看这对您是否有任何帮助方案 - http:/ /www.hibernate.org/subprojects/validator.html – Sashi

+0

嗨萨西,这是不可能的验证。我可以谷歌和感兴趣的人谁真的已经解决了这个问题。 –

回答

0

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

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

可以做这项工作。


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

如果触发器无法编码,则必须强制实体与应用代码保持一致。使用save(entity)创建一个服务,该服务将拒绝具有例外的有害实体。

+0

嗨塞巴斯蒂安,你不明白这个问题。关于带条件的UniqueConstraint的问题。在保存到数据库之前,您需要确保日期在此表中是唯一的,但您只需检查表中validThru!= null && validThru

+0

在我看来,这是不可能处理这与注释。或者你需要创建一个自定义的BeanValidation约束,它将能够检查数据库中的记录。您宁愿直接使用应用程序代码来确保您的条件,而不是尝试使用注释 –

+0

这是处理此问题的简单方法,但这是非常恶劣的解决方案,因为我需要在保存之前创建额外图层以检查“这些”实体是否处于额外条件并分别创建db限制到数据库,所以如果有人忘记将这个约束条件添加到这两个地方,潜在地可能会出现失效 –

0

而不是日期,您可以使用TimeStamp.and唯一的列约束verion和id.So任何情况下您的记录可能是唯一的。 您可以使用状态作为列的另一种方式特别记录Valid-V和Invalid -I.you只能根据所选内容显示有效或无效的记录

+0

嗨Ravi,我想你不明白问题的要点 –