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

JPA Hibernate 5: OneToOne in nested Embeddable causes metamodel issue

我有一个实体:

@Entity
public class Test {

    @Embedded
    Content content;

// getters setters..
}

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

@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: Unable to locate static metamodel field : org.package.Language_#identifierCode; this may or may not indicate a problem with the static metamodel

的确,当打开元模型时class 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_ 正确地为 person 生成了单数属性!

似乎在使用多个嵌套的可嵌入对象时出了点问题。当只使用一层嵌入时,它是有效的。

我尝试了其他东西:

  1. 在 class 上添加 Access.Field。没有任何反应。
  2. 实例化@Embedded class,比如@Embedded Language language = new Language()。没有任何反应。
  3. 用@ManyToOne 替换了@OneToOne。没有任何反应。

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

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

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