【问题标题】:Group few JPA annotations into one将几个 JPA 注释组合成一个
【发布时间】:2018-11-29 09:06:22
【问题描述】:

我的实体中有以下映射:

@CollectionTable(name = "test_entity_data", joinColumns = @JoinColumn(name = "test_entity_id"))
@ElementCollection
@MapKeyColumn(name = "language", length = 10)
@MapKeyClass(Language.class)
@MapKeyEnumerated(EnumType.STRING)
@Column(name = "value", nullable = false)
private Map<Language, String> data = new HashMap<>();

我必须在我的代码中的几个地方使用相同的映射。有没有办法可以将这些注释组合成一个?例如。 @MultilangualData?

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa spring-data


    【解决方案1】:

    如果使用 JPA 2.2,那么您可以使用“元注释”。这是基本的 Java,而不是特定于 JPA。见this blog post

    【讨论】:

    • 我不能,因为我想使用的大多数注释都适用于非类型字段
    • 您可以在字段级别或类级别进行元注释!这就是@Target 的用途。那个链接说You can do the same thing ... for annotations on fields/methods.
    【解决方案2】:

    您可以创建自己的自定义验证器并在您的实体中使用它。

    基本上你创建一个新的注释如下:

    @Target( { ElementType.PACKAGE })
    @Retention(RUNTIME)
    @Constraint(validatedBy = MultilangualDataValidator.class)
    public @interface MultilangualData{
    
        String message() default "MultilangualData validation failed";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    

    并编写一个验证器来验证使用此注解时的所有条件:

    public class MultilangualDataValidator implements ConstraintValidator<MultilangualData, String> {
    
        private MultilangualData multilangualData;
    
        public void initialize(MultilangualData constraintAnnotation) {
            this.multilangualData = constraintAnnotation.value();
        }
    
        public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
    
            // Do your validation here.
        }
    
    }
    

    引用自: https://docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/validator-customconstraints.html

    【讨论】:

    • 如何在验证器中应用例如@MapKeyColumn
    • 您可以在 isValid 方法中添加验证,如下所示:ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set&lt;ConstraintViolation&lt;String&gt;&gt; constraints = validator .validate("&lt;your felid value&gt;");
    • “Bean Validation API”注释与将 JPA 注释分组到一个注释中以节省输入完全没有关系。哎呀,使用 JPA,您甚至不需要启用 Bean 验证。
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2011-07-31
    • 2023-03-20
    • 2011-01-02
    相关资源
    最近更新 更多