Frage

Ich bin mir nicht wirklich sicher, wie Annotationen tatsächlich funktionieren. Ich bin mit JAXB und JPA (mit Eclipselink) auf den gleichen Klassen, i. e. Ich erhalte Klassendefinitionen wie folgt:

@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...
}

Jetzt erhalte ich seltsame Fehler (zum Beispiel „com.econemon.suite.common.models.Channel@115c974 ist kein bekanntes Entitätstyp“, die in der Regel bedeuten würden, dass die Klasse nicht in meinem persistence.xml) und ich frage mich, ob die Anmerkungen miteinander interferieren werden?

War es hilfreich?

Lösung

Eine Anmerkung kann eine andere Anmerkung nicht stören, esp. nicht, wenn die kamen aus verschiedenen Pakete und unterschiedliche Namen haben. Jeder Rahmen (JAXB und Hibernate) hat eine eigenen Anmerkungen. Jeder Rahmen introspect nur dort eigene Anmerkungen. Ich bin sehr sicher, dass dies nicht das Problem hier.

Bitte überprüfen Sie Ihre Einheit, dieses zu haben:

a) kein Argument Konstruktor (Default-Konstruktor ist in Ordnung, aber wenn man mit Argumenten nur Konstrukteure haben, müssen Sie einen kein Argument Konstruktor JPA bieten, diese geschützt werden können oder Paket sichtbar ....)

b) eine @Id Annotation auf einem Feld oder Getter (wir verwenden Feld basierend Anmerkungen immer, sonst nie mit Feld Annotation in einer Art!)

JPA Getter Anmerkung mischten

c) die Art ist in Ihrer Persistenzeinheit und Ihre Persistenzeinheit verwendet wird

d) der Typ hat eine @Entity Annotation

Wenn Sie verwenden Vererbung (erweitert NamedEntity), müssen Sie mehr JPA mehr Informationen geben, wie Sie, was das abzubilden. Zunächst versuchen die sich NamedEntity Material zu entfernen. Und als Blick auf ein gutes JPA Tutorial, das die Vererbung Varianten erläutert.

Andere Tipps

Nein, tun sie nicht.

entfernte ich alle anderen Anmerkungen und schneiden Sie das Erbe und endete mit einer sehr einfachen Klasse auf. Problem blieb.

Eine Sache, die nicht in meinem Beitrag erwähnt wurde (weil ich dachte, dass es nicht relevant war) war, dass ich diese in einem OSGi-Container renne (Felix wenn es ankommt). Nun, ein solcher Behälter schirmt verschiedene „Bündel“ voneinander, so dass sie nicht jeder des anderen Klassen, bis Sie speziell „Export“ Pakete sehen.

Die kommentierten Klassen wurden in einem anderen Bündel sitzen als mein persistence.xml und ich nahm an, dass ich nur die kommentierten Klassen von einem anderen Bundle importieren könnte und tun anderswo die persistency init Sachen. Stellt sich heraus, kann ich nicht, obwohl ich nicht wirklich verstanden haben, warum.

Wenn Sie also JPA verwenden in Verbindung mit OSGi-Bundles, müssen Sie sicherstellen, dass:

  • Kommentierte Klassen und persistence.xml sind zusammen im gleichen Bündel
  • dieses Bündel exportiert das Paket die kommentierten Klassen mit
  • die persistency Einheit (en) sind im Bundle Manifest-Datei aufgelistet

Sie können dann tun, um die tatsächlichen persistency Dinge (wie EntityManager.persist Aufruf) in verschiedenen Bundles.

Als Seite beachten, ich habe ähnlich seltsame Fehler , wenn JAXB Anmerkungen über Bündel zu verwenden versuchen. Es scheint, dass die JAXBContext und / oder die Object im gleichen Bündel instanziiert werden, die die kommentierten Klassen enthalten. Ich konnte nicht wirklich dieses festzunageln, aber die Dinge im gleichen Bündel geholfen setzen.

Es wäre toll, wenn jemand mit einem tieferen Verständnis der OSGi, das Laden von Klassen und Anmerkungen kommentieren könnte, was hier passiert sein könnte.

Aktualisieren : Exportieren / die richtige Annotation Importieren von Paketen können Sie ermöglicht persistence.xml und kommentierten Klassen in verschiedenen Bundles haben, finden Sie unter hier . Nicht getestet, aber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top