JAXB Unmarshalling Entities - 引用null

时间:2014-11-05 08:47:24

标签: java xml jpa jaxb unmarshalling

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

 ...
}

2 个答案:

答案 0 :(得分:0)

看起来我必须为每个B分配适当的A.这解决了我的问题。

a.getB().forEach(b -> b.setA(a));

我不知道这是一个好的解决方法吗?特别是因为我有其他实体是B的孩子。

答案 1 :(得分:0)

找到解决方案:

BElement.java

中的方法afterUnmarshal
public void afterUnmarshal(Unmarshaller u, Object parent) {
   this.a = (AElement)parent;
}