JAXB& JPA。一对一双向关系(空id)

时间:2016-08-05 17:19:23

标签: java xml jpa jaxb

我正在使用JAXB和JPA。我想将数据从xml文件转换为数据库。以下是2个示例课程。当我将文件解组到java对象中并且当我持久化数据时,我在addres实体中遇到user_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);

但是在unmarshall期间不是

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

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

em.persist(user);

除非我使用此

user.getAddress().setUser(user);

然后就可以了。没有这个怎么办?因为我的xml更复杂。

非常感谢。

1 个答案:

答案 0 :(得分:0)

JAXB提供预处理和后处理的机制。 在unmarshal之后,你必须在Address类中设置用户。为此,请将以下回调方法添加到Address类:

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

导入抽象类Listener

import javax.xml.bind.Unmarshaller.Listener; 

在为此对象解组所有属性(IDREF除外)之后但在此对象设置为父对象之前调用此方法。 有关更多信息,请参阅 apply