2017-10-12 2 views
0

J'ai une entité:JPA Hibernate 5: OneToOne dans intégrable imbriquée provoque problème de métamodèle

@Entity 
public class Test { 

    @Embedded 
    Content content; 

// getters setters.. 
} 

Ce contient une classe intégrée que vous pouvez voir:

@Embeddable 
public class Content { 

    @OneToOne 
    Person person; 

    @Embedded 
    Language language; 

// getters setters.. 
} 

Il contient à nouveau une intégrable. 2 fois emboîtées intégrable

@Embeddable 
public class Language { 

    String format; 

    @OneToOne 
    IdentifierCode identifierCode; 

// getters setters.. 
} 

Lorsque vous utilisez la fonction de génération automatique de schéma de JPA toutes les colonnes sont générées de manière correcte.

J'utilise l'annotation @data sur chaque @Entity et @Embeddable pour générer des getters, setters, constructeurs, etc ..

Lors du démarrage du serveur d'applications (EAP 7), je remarque cet avertissement dans les journaux:

HHH015011: Impossible de trouver le champ métamodèle statique: org.package.Language_ # identifierCode; cela peut ou peut ne pas indiquer un problème avec le métamodèle statique

En effet, lors de l'ouverture de la classe métamodèle Language_; aucune référence de colonne identificateurCode est présent:

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

    public static volatile SingularAttribute<Language, String> format; 

} 

Je ne vois pas ce que je fais wroing. Est-il impossible d'utiliser @OneToOne dans un @Embeddable imbriqué? Le métamodèle Content_ génère correctement l'attribut singulier pour la personne!

Il semble que lorsque vous utilisez plusieurs Embeddables imbriqués, quelque chose ne va pas. Lorsque vous utilisez un seul niveau d'embeddables, cela fonctionne.

J'ai essayé d'autres choses:

  1. Ajout Access.Field sur la classe. Rien ne se passe.
  2. Instancier la classe @Embedded, comme @Embedded Language language = new Language(). Rien ne se passe.
  3. Remplacé le @OneToOne par @ManyToOne. Rien ne se passe.
+1

Cela ressemble à un bogue dans votre fournisseur JPA. Le fournisseur JPA que j'utilise (pas Hibernate) crée un '' public variable volatile SingularAttribute identificateurCode; ' – DN1

+0

@ DN1 lequel utilisez-vous et quelle version? Je voudrais essayer ceci avec votre fournisseur –

+1

DataNucleus JPA. Une option que vous avez est d'utiliser simplement le 'datanucleus-jpa-query.jar' dans votre CLASSPATH pour générer le métamodèle statique et utiliser ces classes générées avec votre fournisseur existant, ou l'utiliser aussi pour la persistance. – DN1

Répondre

1

Cela ressemble à un bogue dans votre fournisseur JPA, que vous devez signaler à eux.

Le fournisseur JPA J'utilise (DataNucleus) crée une option public static volatile SingularAttribute<Language, mydomain.model.IdentifierCode> identifierCode;

Celui que vous avez est d'utiliser simplement le datanucleus-jpa-query.jar dans votre CLASSPATH pour générer le métamodèle statique et utiliser les classes générées avec votre fournisseur actuel, également utiliser pour la persévérance aussi.