如何为集合项添加约束

How to add constraint to collection items

我有一个包含字符串集合的实体。我想添加一个约束来检查集合中的所有项目是否都小于 255。

假设我有一个包含 references 集合的实体 Area。我想确保所有参考文献都短于 255 个字符。你知道我怎样才能实现它吗?

@Entity
@Table(name = "AREA")
public class Area  Serializable {

    private static final long serialVersionUID = -4756123949793458708L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", unique = true, nullable = false)
    private Integer id;

    @ElementCollection
    @CollectionTable(name = "AREA_REFERENCES", joinColumns = @JoinColumn(name = "AREA_ID"))
    @Column(name = "REFERENCE", nullable = false)
    @Size(max = 255) // THIS ANNOTATION SEEMS TO NOT WORK
    private Set<String> references = new HashSet<>();

    ....

根据 how-to-limit-the-column-length-while-using-collection-of-primitive-type,您可以将大小约束设置为列注释。

对于验证,您可以从 Bean 验证 API (JSR 303) 添加类似 @Size(max=allowed_length) 的约束。

Hibernate 使用 Bean Validation 约束来生成准确的数据库模式。 例如:

@Size.max 导致 varchar(max) 定义 Strings@Min, @Max 导致列检查(如值 <= 最大值)

这样注释

@Size(max = 255)
private Set<String> references;

表示Set<String>最多允许包含255个字符串。 当然这不是你想要的。

相反,您希望每个字符串最多包含 255 个字符: 您可以通过在 < > 中注释类型参数来实现它,如下所示:

private Set<@Size(max = 255) String> references;

为此,您需要全新版本的 Hibernate Validator (6.0.x) 和 Bean 验证 (2.0.1).

对于类似的问题,另请参阅此