JPA Hibernate 5:嵌套Embeddable中的OneToOne会导致元模型问题

时间:2017-10-12 13:20:33

标签: jpa hibernate-5.x metamodel

我有一个实体:

@Entity
public class Test {

    @Embedded
    Content content;

// getters setters..
}

这包含一个嵌入式类,如您所见:

@Embeddable
public class Content {

    @OneToOne
    Person person;

    @Embedded
    Language language;

// getters setters..
}

这又包含了一个可嵌入的内容。 2次嵌套嵌入

@Embeddable
public class Language {

    String format;

    @OneToOne
    IdentifierCode identifierCode;

// getters setters..
}

使用JPA的自动模式生成功能时,所有列都以正确的方式生成。

我在每个@Entity和@Embeddable上使用@Data注释来生成getter,setter,构造函数等。

启动应用程序服务器(EAP 7)时,我会在日志中注意到此警告:

  

HHH015011:无法找到静态元模型字段:   org.package.Language_#identifierCode;这可能会也可能不会表明   静态元模型的问题

确实,在打开元模型类Language_时;没有identifierCode列引用:

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Language.class)
public abstract class Language_ {

    public static volatile SingularAttribute<Language, String> format;

}

我不知道我在做什么。是否无法在嵌套的@Embeddable中使用@OneToOne?元模型Content_正确地为人生成单数属性!

似乎在使用多个嵌套的嵌入式时,出现了问题。当只使用一个级别的嵌入时,它可以工作。

我尝试了其他的东西:

  1. 在类上添加Access.Field。没有任何事情发生。
  2. 实例化@Embedded类,如@Embedded语言语言=新语言()。没有任何事情发生。
  3. 用@ManyToOne替换@OneToOne。没有任何事情发生。

1 个答案:

答案 0 :(得分:1)

这听起来像是您的JPA提供程序中的错误,您应该向他们报告。

我使用的JPA提供程序(DataNucleus)创建了一个 public static volatile SingularAttribute<Language, mydomain.model.IdentifierCode> identifierCode;

您可以选择使用CLASSPATH中的datanucleus-jpa-query.jar生成静态元模型,并将这些生成的类与现有提供程序一起使用,或者将其用于持久性。