【发布时间】:2017-10-12 13:20:33
【问题描述】:
我有一个实体:
@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_ 正确地为 person 生成奇异属性!
似乎在使用多个嵌套嵌入时出现问题。仅使用一级嵌入时,它可以工作。
我尝试了其他东西:
- 在类中添加 Access.Field。什么都没有发生。
- 实例化@Embedded 类,如@Embedded Language language = new Language()。什么都没有发生。
- 将@OneToOne 替换为@ManyToOne。什么都没有发生。
【问题讨论】:
-
听起来像是您的 JPA 提供程序中的错误。我使用的 JPA 提供程序(不是 Hibernate)创建了一个
public static volatile SingularAttribute<Language, mydomain.model.IdentifierCode> identifierCode; -
@DN1 你用的是哪个版本?我想和你的提供商一起试试这个
-
DataNucleus JPA。您的一种选择是只使用 CLASSPATH 中的
datanucleus-jpa-query.jar来生成静态元模型并将这些生成的类与现有的提供程序一起使用,或者也将其用于持久性。 -
好主意!我用 datanucleus 替换了 hibernate jar,它成功生成了!我会记录一个错误。如果您愿意,可以将其添加为答案。。
标签: jpa hibernate-5.x metamodel