Question

Je ne sais pas trop comment fonctionnent les annotations. J'utilise JAXB et JPA (avec eclipselink) sur les mêmes classes, i. e. Je reçois des définitions de classe comme ceci:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Channel")
@Entity
public class Channel extends NamedEntity {
    @XmlAttribute
    @XmlSchemaType(name = "anyURI")
    @Column(name="url")
    protected String url;

    @XmlAttribute
    @Column
    protected String coDirection;
    // etc...
}

Maintenant, des erreurs étranges se produisent (par exemple, "com.econemon.suite.common.models.Channel@115c974 n'est pas un type d'entité connu", ce qui voudrait généralement dire que la classe ne figure pas dans persistence.xml). et je me demande si les annotations vont interférer les unes avec les autres?

Était-ce utile?

La solution

Une annotation ne peut pas interférer avec une autre annotation, en particulier. pas si les provenaient de paquets différents et ont des noms différents. Chaque framework (JAXB et Hibernate) ont leurs propres annotations. Chaque cadre introspecte seulement ses propres annotations. Je suis certain que ce n'est pas le problème ici.

veuillez vérifier votre entité pour avoir ceci:

a) constructeur sans argument (le constructeur par défaut convient, mais si vous n'avez que des constructeurs avec des arguments, vous devez fournir un constructeur sans argument à JPA, il peut être protégé ou visible par un package ....)

b) une annotation @ Id sur un champ ou un getter (nous utilisons toujours des annotations basées sur des champs, sinon vous ne devez jamais mélanger une annotation JPA getter avec une annotation de champ dans un type!)

c) le type est dans votre unité de persistance et votre unité de persistance est utilisée

d) le type a une annotation @Entity

Si vous utilisez l'héritage (étend NamedEntity), vous devez donner plus d'informations à JPA pour savoir comment vous pouvez mapper cela. Au début, essayez de supprimer les éléments NamedEntity. Et que de regarder un bon tutoriel JPA qui explique les variantes d'héritage.

Autres conseils

Non, ils ne le font pas.

J'ai supprimé toutes les autres annotations, coupé l'héritage et fini avec une classe très simple. Le problème est resté.

Une chose qui n’a pas été mentionnée dans mon message (parce que je pensais que ce n’était pas pertinent) était que je l’utilisais dans un conteneur OSGi (Félix si cela comptait). Or, un tel conteneur protège différents "paquets". les uns des autres, afin qu'ils ne puissent pas voir les classes des autres tant que vous n'avez pas spécifiquement "exporté" forfaits.

Les classes annotées étaient dans un bundle différent de mon persistence.xml et j'ai supposé que je pouvais simplement importer les classes annotées d'un autre bundle et effectuer le reste du processus d'initiation. Il s'avère que je ne peux pas, bien que je n'aie pas vraiment compris pourquoi.

Ainsi, si vous utilisez JPA avec des offres OSGi, vous devez vous assurer que:

  • Les classes annotées et persistence.xml sont ensemble dans le même lot
  • ce bundle exporte le package contenant les classes annotées
  • les unités de persistance sont répertoriées dans le fichier manifeste du paquet

Vous pouvez ensuite effectuer les opérations de persistance réelles (par exemple, appeler EntityManager.persist) dans différents lots.

En guise de remarque, j'ai des erreurs aussi étranges / a> lorsque vous essayez d'utiliser des annotations JAXB dans des ensembles. Il semble que JAXBContext et / ou ObjectFactory doivent être instanciés dans le même bundle contenant les classes annotées. Je ne pouvais pas vraiment comprendre, mais mettre les choses dans le même paquet m'aidait.

Ce serait formidable si quelqu'un ayant une connaissance plus approfondie d'OSGi, du chargement de classe et des annotations pouvait commenter ce qui pourrait se passer ici.

Mettre à jour : l'exportation / importation des packages d'annotation appropriés peut vous permettre d'avoir persistence.xml et des classes annotées dans différents ensembles. Voir ici . N'a pas encore été testé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top