我正在使用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更复杂。
非常感谢。
答案 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