2016-08-05 11 views
0

私はJAXBとJPAを使用しています。私は、XMLファイルからデータベースにデータを変換したいと思います。以下に2つのクラスの例を示します。私がJavaオブジェクトにファイルをアンマーシャリングするとき、データを保持するとき、私はaddresエンティティのuser_idに問題があります(空です)。JAXB&JPA。 1対1の双方向関係(空のID)

私はそれをマニュアルに設定するとすべてが問題ありませんが、問題はアンマーシャル中です。

クラスのユーザー

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

クラス住所

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

私は手動でオブジェクトを作成すると、すべてが

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

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

em.persist(user); 

が、アンマーシャリングない

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

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

em.persist(user); 
中にokです私は、この

user.getAddress().setUser(user); 

を使用する場合を除き、

はokです。これをせずにどうすればいいですか?私のXMLはより複雑なので。

ありがとうございます。

+0

AddressクラスのUserメンバーから '@XmlTransient'を削除しようとしましたか? –

+0

私は試しましたが、動作しません – dziorkowsky

答えて

0

JAXBでは、前処理および後処理のためのメカニズムを提供しています。 非整列化の後、Addressクラスでユーザーを設定する必要があります。これはアドレスクラスに次のコールバックメソッドを追加してください。

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

インポート抽象クラスリスナー

import javax.xml.bind.Unmarshaller.Listener; 

このメソッドが呼び出されます(IDREFを除く)すべてのプロパティの後には、このオブジェクトの整列化されていますこのオブジェクトが親オブジェクトに設定される前に実行されます。 詳細については、 here

関連する問題