Mapping einer 1:n in Hibernate

Status
Nicht offen für weitere Antworten.

number8

Aktives Mitglied
Hallo. Gut, das ist ja an sich kein Thema. Ich habe:

In der Klasse Person
Code:
@ManyToOne(optional=false)
@JoinColumn(name="addr_ID")
private Address _Address;
und in der Klasse Address
Code:
@OneToMany(mappedBy="_Address")
private List<Person> _Personen = new ArrayList<Person>();
Durch den Code lasse ich mir die Tabellen von Hibernate generieren.

Damit habe ich u.a. ja in der Klasse Person ein komplettes Address-Objekt.
Kann man es irgendwie hinbiegen, daß in Person anstatt des Adress-Objektes
nur die ID der entsprechenden Adresse abgelegt wird und trotzdem die
Tabellen mit den Beziehungen usw. ordentlich generiert werden etc.?
 
Code:
@ManyToOne(optional=false) 
@JoinColumn(name="addr_ID") 
private Long _AddressId;

@OneToMany(mappedBy="_AddressId") 
private List<Person> _Personen = new ArrayList<Person>();
 
Ich kann es momentan nicht testen (habe sowas aber glaube ich schonmal probiert), aber kommt da nicht immer der Fehler: ...references an unknown entity: java.lang.Long?
 
Ups, targetEntity fehlt noch. So geht es aber auf jeden Fall.
Code:
@ManyToOne(targetEntity=Address.class, optional=false)
@JoinColumn(name="addr_ID") 
private Long _AddressId;
 
Übrigens, falls der Grund dafür, warum du es so machen möchtest, der ist, dass du bei List-Queries die Adressen
nicht gleich mit laden möchtest, dann kannst du das gleiche mit FetchType.LAZY erreichen.
Code:
@ManyToOne(optional=false, fetch=FetchType.LAZY) 
@JoinColumn(name="addr_ID") 
private Address _Address;
 
Nee, die Lazy ist nicht der Grund.
Ich habe es mal probiert und bekomme:

could not set a field value by reflection setter of de.beans.Person._AddressID
...
...
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field de.beans.Person._AddressID
to
de.beans.Address
 
Na folgendes Problem - ich habe eigentlich eine rekursive Beziehung auf Person (und wollte das so lösen wie oben angesprochen, also nur die IDs der anderen Personen abbilden,mit der die Person in Beziehung steht). Das Resultat, also ne Person, soll als Rückgabe aus nem Jax-ws zur Verfügung stehen. Nur leider hat der xml-parser da Probleme, da angeblich eine entity/elemenknoten nicht richtig geschlossen ist. Ich vermute, daß <person> auf grund der rekursiven Beziehung ein/mehrere <person> enthält und noch nicht geschlossen wurde (also <person>...<person>). Oder?
 
number8 hat gesagt.:
Nee, die Lazy ist nicht der Grund.
Ich habe es mal probiert und bekomme:

could not set a field value by reflection setter of de.beans.Person._AddressID
...
...
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field de.beans.Person._AddressID
to
de.beans.Address
Wo wird der Fehler ausgelöst? Doch nicht bei einer Query?
 
Ich glaube ich lass das mit der ID. Habe mal einen Workaround gemacht und bekomme trotzdem den xml-error. Danke für eure Antworten. Vor allem Gast :wink:

Ich habe hier (JAX-WS 2.1.4, siehe oben):

javax.xml.stream.XMLStreamException: ParseError at [row,col]: [1,95]
Message: XML document structures must start and end within the same entity.

kann man den xml/soap-kram irgendwie anzeigen lassen?
Is ne Liste innerhalb des Personen-Objektes, die dieses Prob verursacht.
 
Ich kann mich da so wage erinnern, dass JAX-WS mit Collections, insbesondere solchen mit Generics,
nichts anfangen konnte. Man musste es zu Arrays mappen. Ich weiss nicht, ob es immer noch gilt.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben