如何映射与JAXB和JPA的一对多关系

时间:2016-02-09 15:39:11

标签: java xml jpa jaxb

我正在使用Apache Camel从Web服务中检索信息。检索到的信息将使用JAXB进行解组并映射到实体类,以将信息保存到关系数据库(在本例中为Oracle)中。

检索到的信息之间存在关联。首先,检索到的所有都涉及项目。在第二个请求中,检索所有项目。每个项目都有一个所有者,它指的是一个人的身份。

为了使事情更清楚,这里有一些Web服务的示例响应。

<response>
 <people>
  <person>
     <ixPerson>2</ixPerson>
     <sFullName>XXX</sFullName>
     ...
  </person>
  <person>
     <ixPerson>3</ixPerson>
     <sFullName>YYY</sFullName>
     ...
  </person>
 </people>
</response>

项目:

<response>
 <projects>
  <project>
     <ixProject>33</ixProject>
     <sProject>My Project 1</sProject>
     <ixPersonOwner>2</ixPersonOwner>
     ...
  </project>
  <project>
     <ixProject>34</ixProject>
     <sProject>My Project 2</sProject>
     <ixPersonOwner>3</ixPersonOwner>
     ...
  </project>
 </projects>
</response>

以下实体(仅显示摘录)用于将XML映射到JAXB并将其持久保存到数据库:

@Entity
@NamedQuery(name="Person.findAll", query="SELECT p FROM Person p")
@XmlType(name="person")
public class Person implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  private long id;

  private String fullname;

  //bi-directional many-to-one association to Project
  @OneToMany(mappedBy="person")
  private List<Project> projects;
  ...
  @XmlElement(name="ixPerson")
  public void setId(long id) {
    this.id = id;
  }

  @XmlElement(name="sFullName")
  public void setFullname(String fullname) {
    this.fullname = fullname;
  }
}

项目实体:

@Entity
@NamedQuery(name="Project.findAll", query="SELECT p FROM Project p")
@XmlType(name="project")
public class Project implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private long id;

    private String name;

    //bi-directional many-to-one association to Person
    @ManyToOne
    @JoinColumn(name="OWNER")
    private Person person;

    @XmlElement(name="ixProject")
    public void setId(long id) {
       this.id = id;
    }

    @XmlElement(name="sProject")
    public void setName(String name) {
       this.name = name;
    }

    @XmlElement(name="ixProjectOwner")
    public void setPerson(Person person) {
      this.person = person;
    }
}

所有人都是正确的解组,可以持久保存到数据库。但是当我解组项目时,未编组的数据看起来像:

<project>
   <ixProject>12</ixProject>
   <sProject>Project 3</sProject>
   <ixPersonOwner>
      <ixPerson>0</ixPerson>
   </ixPersonOwner>
</project>

持久化项目的表仅将人的id作为所有者,ixPerson始终为0.

如何获得对类/实体Person的正确引用,以便我可以使用JPA保留它?

将JAXB和JPA混合在一个类中是否可以实现这一点,还是必须将其拆分,以实现我的目标?

0 个答案:

没有答案