我有两个映射类(类似于JPA类):
AElement.java
@XmlType(propOrder = {"name", "children", })
@XmlRootElement(name = "a")
@XmlAccessorType( XmlAccessType.PROPERTY)
public class AElement implements Serializable {
private String name;
private List<BElement> children;
@XmlElement(name = "metadatum")
public List<BElement> getChildren(){
return children;
}
...
}
BElement.java
@XmlRootElement(name = "b")
@XmlType(propOrder = {"name"})
public class BElement implements Serializable{
private String name;
private AElement parent;
...
}
A和B处于OneToMany关系中。XML应该如下所示:
<A>
<B></B>
<B></B>
</A>
如果我对xml进行解组,将其映射到我的JPA类,并将其持久化到我的数据库中,那么一切都是正确存储,我的引用除外。这意味着B
被存储在数据库中而没有A
的外键。
我将JPA与Hibernate结合使用。以下是我的JPA课程:
A.java
@Entity
public class A implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column
private String name;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "parent")
private List<B> children;
public List<B> getChildren(){
return children;
}
...
}
B.java
@Entity
public class B implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column
private String name;
@ManyToOne(optional = true)
@JoinColumn(name = "a_id", referencedColumnName = "id")
private A parent;
...
}
看起来我必须为每个B分配适当的A。这解决了我的问题。
a.getB().forEach(b -> b.setA(a));
我不知道这是否是一个好的变通方法?特别是因为我有其他实体是B
的子实体。
找到了一个解决方案:
类BElement.java中的方法afterUnmarshal
public void afterUnmarshal(Unmarshaller u, Object parent) {
this.a = (AElement)parent;
}