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 entitiesを確認することは可能ですか(validThru == null || validThru < new Date())?

データベースのデータが正しくありません (2 つのレコードの日付が同じで、どちらも有効です):

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

データベースの正しいデータ (2 つのレコードは同じ日付ですが、2 番目のレコードは無効です):

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

データベースのデータが正しくありません (2 つのレコードは同じ日付で両方とも有効で、2 番目のレコードは 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

日付の代わりに、TimeStamp.and 一意の列制約を verion と id で使用できます。これにより、どのような状況でもレコードを一意にすることができます。ステータスを列として使用する別の方法 選択に基づいて、有効なレコードまたは無効なレコードのみを表示できます。

于 2014-10-14T12:49:14.933 に答える