【问题标题】:Hibernate Check Annotation休眠检查注解
【发布时间】:2015-11-06 03:20:23
【问题描述】:

我有一个包含三个字段的表,例如 a、b、c。我想添加一个约束,确保如果 a 不为空,那么 b 和 c 也不为空。我已经使用以下 SQL 完成了该操作

ALTER TABLE sample 
ADD CONSTRAINT no_nulls
CHECK (CASE WHEN a IS NOT NULL THEN b IS NOT NULL AND c IS NOT NULL END)

有没有办法使用休眠注解@Check 来达到同样的效果?

我找不到该注释的有用示例,开发人员是否倾向于根本不使用它?

【问题讨论】:

  • 转换“a is null or (b is not null and c is not null)”是否更容易?

标签: java sql hibernate jpa check-constraints


【解决方案1】:

是的,如果 @Check 像这样在类级别使用是可能的:

@Entity
@Check(constraints = "COL_A IS NULL OR (COL_B IS NOT NULL and COL_C IS NOT NULL)")
public class Sample {

    @Column(name = "COL_A")
    private Long a;

    @Column(name = "COL_B")
    private Long b;

    @Column(name = "COL_C")
    private Long c;

}

(请注意,我使用@jarlh 评论重写了您的条件。)。 @Check注解的constraints子句需要引用@Column的name属性(必须是纯SQL)。

@Check 注释需要在类级别,因为Hibernate bug。

【讨论】:

  • 假设我有:///////////@Column(name = "sample") private Long a; ///////// 我应该在检查约束中使用哪一个? “一个”还是“样本”?我想问题是:是否使用了 HQL 或 SQL?
  • 显然@Check 只能在班级级别使用一次。我们如何添加多个约束?
  • 任何想法,如果这是可能的,我有多个命名检查约束,但没有办法添加它们
【解决方案2】:

在类级别使用下一个注释检查所有三列,例如:

@Check(constraints = "COL_A >= 15 AND COL_B 100")

分别是 COL_A、COL_B 和 COL_C 要检查的列名

不要检查可为空的列。 @NotNull 优于 @Check。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。
猜你喜欢
  • 1970-01-01
  • 2013-09-02
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 2011-03-14
  • 1970-01-01
相关资源
最近更新 更多