2017-10-12 129 views
0

我有一個實體:JPA休眠5:OneToOne嵌套嵌入導致的元模型問題

@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,設置器,構造等。

當啓動應用程序服務器(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_正確地爲人生成單數屬性!

它使用多個嵌套embeddables時似乎出現錯誤。當只使用一種嵌入級別時,它可以工作。

我嘗試過其他的東西:

  1. 在類中添加Access.Field。什麼都沒發生。
  2. 實例化的類@Embedded,像@Embedded語言的語言=新語言()。什麼都沒發生。
  3. 替換爲@ManyToOne的@OneToOne。什麼都沒發生。
+1

聽起來像您JPA提供商中的錯誤。我使用(沒有休眠)JPA提供者創建了一個'公共靜態揮發SingularAttribute <語言,mydomain.model.IdentifierCode> identifierCode;' – DN1

+0

@ DN1您使用和哪個版本是哪一個?我想與您的供應商 –

+1

DataNucleus JPA一起嘗試此操作。你有一個選擇就是在CLASSPATH中使用'datanucleus-jpa-query.jar'來生成靜態元模型,並將這些生成的類與現有的提供者一起使用,或者將它用於持久化。 – DN1

回答

1

這聽起來像是在你的JPA提供了一個bug,你應該向他們彙報。

我使用JPA提供商(DataNucleus將)創建你有 public static volatile SingularAttribute<Language, mydomain.model.IdentifierCode> identifierCode;

一種選擇是隻使用datanucleus-jpa-query.jar在CLASSPATH生成靜態元模型,並使用這些生成的類與您現有的供應商,選擇使用它也用於持久性。