【问题标题】:JAXB Unmarshalling Entities - References nullJAXB 解组实体 - 引用 null
【发布时间】:2014-11-05 08:47:23
【问题描述】:

我有 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 的外键的情况下存储在数据库中。

我在 Hibernate 中使用 JPA。跟随我的 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;

 ...
}

【问题讨论】:

  • 我认为您应该添加有关持久性的更多信息,这似乎是 JPA 问题。
  • 你确定B表中存在a_id列吗?无论如何,@ManyToOne optional = true 是不必要的,因为它是默认值,您也可以在 JoinColumn 上删除 referencedColumnName = "id"
  • 是的,有一个列 a_id。我有一个用于插入数据的网络客户端,我正在尝试添加导出/导入功能。所以我认为这个问题与解组有关。
  • 是的,你是对的.. 问题是解组。读取 xml 时,在对象 B 中没有对 A 的引用。要正确保持双向关系,您必须在对象的两侧添加。简而言之,当您尝试坚持 B 的实例时,没有对 A 的引用。
  • 更多信息:我正在通过 DOZER 进行映射。所以映射类的每个字段的每个值都被映射到 jpa 类。之后,我在 JPA 类中得到相同的值(也是所有 B 条目)。然后,我正在调用我的持久函数。查看数据库,a_id 列为NULL。

标签: java xml jpa jaxb unmarshalling


【解决方案1】:

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

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

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

【讨论】:

  • 不是解决方法,但它是保持双向关系的正确方法。正如我在之前的评论中所说。推土机没有设置双方的关系。
  • 无论如何,你所有的关系都需要双向性吗? ..如果你删除它(例如B中的@ManyToOne)一切正常(没有上述解决方案)。
  • 是的,我需要它们是双向的。有没有办法用 DOZER 进行双向映射?
  • 您的第一个问题是 JAXB 没有在 B 中设置 A 引用。如果您采用这种方式,我认为您在尝试编组 A 时可能会遇到循环引用问题。无论如何尝试使用 @ 987654323@.
  • 你说的这个是什么意思?
【解决方案2】:

找到解决办法:

BElement.java

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

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多