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