2016-08-05 34 views
0

Ich verwende JAXB und JPA. Ich möchte Daten von einer XML-Datei in eine Datenbank konvertieren. Im Folgenden sind 2 Beispiele der Klasse. Wenn ich Datei in Java-Objekt entpacke und wenn ich Daten persistiere, habe ich ein Problem mit user_id in addres entity (ist leer);JAXB & JPA. Eins zu eins bidirektionale Beziehung (leere ID)

Wenn ich es manuell eingestellt habe ist alles in Ordnung, aber das Problem ist während der Unmarshall.

Klasse Benutzer

@XmlRootElement(name = "User") 
@XmlAccessorType(XmlAccessType.FIELD) 
@Entity(name = "EntUser") 
public class User implements Serializable { 

@XmlTransient 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "id", unique = true, nullable = false) 
private Long id; 

@Column 
private String name; 

@Column 
private String surname; 

@XmlElement(name = "Address") 
@OneToOne(mappedBy = "User", cascade = CascadeType.ALL) 
private Address address; 


public Address getAddress() { 
    return address; 
} 

public void setAddress(Address address) { 
    address.setUser(this); 
    this.address = address; 
} 

Klasse Adresse

@XmlRootElement(name = "Address") 
@XmlAccessorType(XmlAccessType.FIELD) 
@Entity(name = "EntAddress") 
public class Address implements Serializable { 

@XmlTransient 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "id", unique = true, nullable = false) 
private Long id; 

@XmlTransient 
@XmlInverseReference(mappedBy = "address") 
@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
private User user; 

public User getUser() { 
    return user; 
} 

public void setUser(User user) { 
    this.user = user; 
} 

Wenn i-Objekt erstellen manuell alles ok

User user = new User(); 
user.setName("Jack"); 
user.setSurname("AAA"); 

Address address = new Address(); 
user.setAddress(address); 

em.persist(user); 

aber während unmarshall nicht

StringReader reader = new StringReader(xml); 
JAXBContext contex = JAXBContext.newInstance(User.class); 
Unmarshaller unmarshaler = contex.createUnmarshaller(); 

User user = (User) unmarshaler.unmarshal(reader); 

em.persist(user); 

außer, wenn ich Sie mit diesem

user.getAddress().setUser(user); 

dann ist ok. Wie kann ich ohne das auskommen? Weil mein XML komplexer ist.

Vielen Dank.

+0

Haben Sie versucht, den @XmlTransient aus dem Benutzer-Mitglied in Ihrer Klasse Adresse zu entfernen? –

+0

Ich habe es versucht, es funktioniert nicht – dziorkowsky

Antwort

0

JAXB bietet Mechanismen für die Vor- und Nachbearbeitung. Nach dem Unmarshalen müssen Sie den Benutzer in der Klasse Adresse festlegen. Um dies zu tun, die folgende Callback-Methode zur Adress Klasse hinzufügen:

public void afterUnmarshal(final Unmarshaller u, final Object parent) { 
    this.setUser((User)parent); 
} 

Import der abstrakten Klasse Listener

import javax.xml.bind.Unmarshaller.Listener; 

Diese Methode wird nach allen Eigenschaften aufgerufen (mit Ausnahme IDREF) sind entordnet für dieses Objekt, aber bevor dieses Objekt auf das übergeordnete Objekt gesetzt wird. Weitere Informationen finden Sie unter: here