JAXB解组实体-引用为null



我有两个映射类(类似于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;
}

最新更新