Hibernate HH015007:静态元模型字段注入的非法参数:应为:PluralAttributeImpl$SetAttributeImpl;遇到:SingularAttribute

Hibernate HH015007:静态元模型字段注入的非法参数:应为:PluralAttributeImpl$SetAttributeImpl;遇到:SingularAttribute,hibernate,spring-boot,jpa,spring-data-jpa,jpamodelgen,Hibernate,Spring Boot,Jpa,Spring Data Jpa,Jpamodelgen,我最近将我的Spring boot项目从1.5.6更新到了2.0.2,现在我的一个实体及其元模型生成出现了问题。 在我切换到2.0.2之前工作的枚举集的映射出现了问题 启动webapp时,会在日志中显示以下错误: HHH015007: Illegal argument on static metamodel field injection : xxx.TestEntity_#testEnums; expected type : org.hibernate.metamodel.internal.

我最近将我的Spring boot项目从1.5.6更新到了2.0.2,现在我的一个实体及其元模型生成出现了问题。
在我切换到2.0.2之前工作的枚举集的映射出现了问题

启动webapp时,会在日志中显示以下错误:

HHH015007: Illegal argument on static metamodel field injection : xxx.TestEntity_#testEnums; expected type :  org.hibernate.metamodel.internal.PluralAttributeImpl$SetAttributeImpl; encountered type : javax.persistence.metamodel.SingularAttribute
实体及其映射:

public class TestEntity extends AbstractEntity {

   ...

   @JsonIgnore
   @ElementCollection(targetClass = TestEnum.class)
   @Convert(converter = TestEnumConverter.class)
   @CollectionTable(name = "engine_test_enum", joinColumns = @JoinColumn(name = "test_entity_id"))
   private Set<TestEnum> testEnums = new HashSet<>();

   ...
}
转换器类

@Converter
public class TestEnumConverter implements AttributeConverter<TestEnum, Integer> {

    @Override
    public Integer convertToDatabaseColumn(TestEnum testEnum) {
        return TestEnum == null ? null : testEnum.getCode();
    }

    @Override
    public TestEnum convertToEntityAttribute(Integer code) {
        return EnumUtils.fromCode(TestEnum.class, code);
    }

}
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(TestEntity.class)
public abstract class TestEntity_ extends xxx.AbstractEntity_ {

    ...

    public static volatile SingularAttribute<TestEntity, TestEnum> testEnum;

    ...
}
@转换器
公共类TestEnumConverter实现AttributeConverter{
@凌驾
公共整数convertToDatabaseColumn(TestEnum TestEnum){
return TestEnum==null?null:TestEnum.getCode();
}
@凌驾
公共TestEnum convertToEntityAttribute(整数代码){
返回EnumUtils.fromCode(TestEnum.class,code);
}
}
元模型生成的类

@Converter
public class TestEnumConverter implements AttributeConverter<TestEnum, Integer> {

    @Override
    public Integer convertToDatabaseColumn(TestEnum testEnum) {
        return TestEnum == null ? null : testEnum.getCode();
    }

    @Override
    public TestEnum convertToEntityAttribute(Integer code) {
        return EnumUtils.fromCode(TestEnum.class, code);
    }

}
@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(TestEntity.class)
public abstract class TestEntity_ extends xxx.AbstractEntity_ {

    ...

    public static volatile SingularAttribute<TestEntity, TestEnum> testEnum;

    ...
}
@Generated(value=“org.hibernate.jpamodelgen.jpametamodelenticyprocessor”)
@静态元模型(TestEntity.class)
公共抽象类TestEntity_uu扩展xxx.AbstractEntity_u{
...
公共静态属性testEnum;
...
}
我的依赖项:

public class TestEntity extends AbstractEntity {

   ...

   @JsonIgnore
   @ElementCollection(targetClass = TestEnum.class)
   @Convert(converter = TestEnumConverter.class)
   @CollectionTable(name = "engine_test_enum", joinColumns = @JoinColumn(name = "test_entity_id"))
   private Set<TestEnum> testEnums = new HashSet<>();

   ...
}
  • 所有spring启动项目:2.0.2.0版本
  • hibernate core和hibernate jpamodelgen:5.2.17.Final
  • 项目还需要一些LIB
有人知道这种行为的原因吗
首先,我认为清理工作区(使用eclipse)是个问题。但是根据元模型类的时间戳,重新生成元模型类似乎是可以的
正如我们所看到的,生成的类确实包含一个SingularAttribute…但我做错了什么,没有映射为:

SetAttribute<TestEntity, TestEnum> testEnums;
setattributetestenums;

根据此处的说明:

Convert注释不应用于指定 以下内容:Id属性、版本属性、关系属性、, 和显式表示为枚举或时态的属性

因此,您可以使用可嵌入类,而不是
Enum
,并在
attributeName
元素中使用点(“.”)符号来指示嵌入属性中的属性,在本例中,该属性将是您的嵌入类。

您受到