HHH015007:静态元模型字段注入的非法参数:expected:PluralAttributeImpl $ SetAttributeImpl;遇到:SingularAttribute

时间:2018-05-15 08:07:14

标签: hibernate spring-boot jpa spring-data-jpa jpamodelgen

我最近将我的Spring启动项目从1.5.6更新到2.0.2,现在我的一个entites和他们的元模型生成出现了问题。
在切换到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<>();

   ...
}

枚举

public enum TestEnum implements CodeEnum, AliasEnum {

   TEST1(1, "ALIAS1"),
   TEST2(2, "ALIAS2"),
   // ... and so on ...
   ;

   private Integer code;
   private String alias;

   private TestEnum(Integer code, String alias) {
       this.code = code;
       this.alias = alias;
   }

   @Override
   public Integer getCode() {
       return code;
   }

   @Override
   public String getAlias() {
       return alias;
   }
}

转换器类

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

    ...
}

我的依赖关系:

  • 所有春季启动项目:2.0.2.RELEASE
  • hibernate-core&amp; hibernate-jpamodelgen:5.2.17.Final
  • 项目所需的更多库

有人知道这种行为的原因吗?
首先我认为这只是清理工作区的问题(使用eclipse)。但根据时间戳,重新生成元模型类似乎没问题。
正如我们所看到的,生成的类确实包含了一个SingularAttribute ......但我错误的是它没有被映射为:

SetAttribute<TestEntity, TestEnum> testEnums;

1 个答案:

答案 0 :(得分:0)

根据此处的Documentation

  

转换注释不应用于指定转换   以下:Id属性,版本属性,关系属性,   和属性明确表示为Enumerated或Temporal。

因此,您可以使用可嵌入类而不是Enum来使用attributeName元素中的点(“。”)表示法来指示嵌入属性中的属性,在这种情况下将是你的嵌入式课程。