JPA Zusammengesetzter Schlüssel mit ManyToOne org.hibernate.PropertyAccessException abrufen: konnte keinen Feldwert durch Reflection Setter von festlegen

8

Ich habe einen zusammengesetzten Schlüssel ContractServiceLocationPK aus drei IDs ( contractId , locationId , serviceId ) vom Typ lang in einer einbettbaren Klasse. Die Klasse, die diesen zusammengesetzten Schlüssel verwendet, ContractServiceLocation , ordnet diese IDs mithilfe von @MapsId annotation ihren Objekten zu. So sieht es aus (entfernte Setter / Getter und irrelevante Eigenschaften):

Vertrag

%Vor%

ContractServiceLocationPK

%Vor%

ContractServiceLocation

%Vor%

Wenn Sie versuchen, ein Objekt vom Typ ContractServiceLocation in irgendeiner Weise (direkt oder durch einen Vertrag) zu erhalten, bekomme ich:

%Vor%

Meine Annahme ist, dass JPA / Hibernate ein Contract-Objekt anstelle einer langen Variable erwartet, aber wenn ich die Variablen in embeddable von long in ihren Typ ändere, bekomme ich The type of the ID mapped by the relationship 'contract' does not agree with the primary key class of the target entity. . Wenn ich versuche, die ID-Klasse anstelle von embeddable dann mappedby in Contract OneToMany Mapping zu verwenden, bekomme ich In attribute 'contractServiceLocation', the "mapped by" attribute 'contract' has an invalid mapping type for this relationship. . Was muss ich tun, um einen zusammengesetzten Schlüssel mit mehreren ManyToOne -Mappings zu erstellen?

BEARBEITEN: Es wurde ein Snippet hinzugefügt, in dem ich versuche, die Elemente zu erhalten:

%Vor%

Der Grund, warum es so aussieht, statt in einem DAO zu sein, ist, dass ich die Datenbank erzeuge und zuerst die Elemente teste, bevor ich mit der Entwicklung des Rests der App fortfahre.

EDIT 2: Ich habe meine Modelle neu geschrieben und jetzt scheint alles zu funktionieren, außer in Eclipse bekomme ich einen persistenten Fehler. So sehen die Dinge derzeit aus:

Vertrag - Keine Änderung (außer Entfernen der Eager-Lade)

ContractServiceLocationPK - Ist jetzt eine ID-Klasse

%Vor%

ContractServiceLocation

%Vor%

Dies scheint jetzt korrekt zu funktionieren. Es erstellt einen zusammengesetzten Schlüssel und verwaltet eine Viele-zu-Eins-Beziehung mit allen zusammengesetzten Eigenschaften. Es gibt jedoch etwas Seltsames. In Contract eclipse markiert mappedBy für die @OneToMany Annotation für die ContractServiceLocation Sammlung mit der Fehlermeldung In attribute 'contractServiceLocation', the "mapped by" attribute 'contract' has an invalid mapping type for this relationship. . Ich gehe davon aus, dass dies daran liegt, dass die in Contract definierte Eigenschaft ContractServiceLocation keine @ManyToOne Annotation hat, sondern diese in der Composite-Klasse definiert ist. Stolperte ich über "nicht konforme JPA, aber mit Hibernate" Trap oder was ist hier los?

    
MrPlow 19.05.2014, 11:20
quelle

2 Antworten

13

Für Ihre ursprüngliche Frage (nicht modifizierte Variante):

Sie müssen die "ContractServiceLocationPK-ID" in Ihrer ContractServiceLocation-Klasse einfügen. Zeile ersetzen:

  

@EmbeddedId   ContractServiceLocationPK-ID;

mit diesem:

  

@EmbeddedId   ContractServiceLocationPK id = new ContractServiceLocationPK ();

Dann sollte es funktionieren. Weil Hibernate versucht, Eigenschaften innerhalb zu setzen, aber bei NullPointerException fehlschlägt.

    
David Bucek 14.12.2014 09:22
quelle
3

Sie müssen die Getter und Setter auch in Ihre @ Embeddable-Klasse setzen, Ihre hashCode () - und equals () -Methoden werden in die Klasse gehen, die ich in Ihrer Klasse hier nicht sehen konnte.

Um die ContractServiceLocation zu speichern, müssen folgende Objekte zuerst gespeichert werden, da Sie ihre IDs als zusammengesetzten Schlüssel für die ContractServiceLocation verwenden, richtig? Hier, was Sie tun, ist, dass Sie diese als neue Objekte erstellen, so dass sie offensichtlich ihre ID nicht haben werden, weil sie nicht bestehen. Daher müssen Sie sie zuerst beibehalten und die persistenten Objekte verwenden und Objekte in ContractServiceLocation festlegen.

%Vor%     
Bilbo Baggins 19.05.2014 11:34
quelle