我以下列格式从Web服务获得XML响应:
<main-node>
<node>
<id>101</id>
<name>Test</name>
<address>test</address>
<address>test1</address>
</node>
<node>
<id>102</id>
<name>Jack</name>
<address>New York</address>
<address>London</address>
<address>Canberra</address>
<address>Cape Town</address>
</node>
</main-node>
我创建了POJO类并很好地映射它们,并且能够将值存储在MySQL数据库中。但是,对于address
字段,只保存其中一个地址。如何在数据库中存储多个值?
这是我用于前面提到的XML结构的POJO:
@Entity
@XmlRootElement(name="node")
public class Node{
@Id
private int id;
private String name;
private String address;
//Getters and Setters
}
我已经尝试将String[]
用于address
字段,但这也不起作用。
问题是address
字段将映射到MySQL中名为address
的列,而数据库列只能包含一个值。
解决方案是创建一对多关系,这意味着您需要在node_address
表旁边单独的node
表,其中至少包含node_id
和address
字段。
现在,对于JPA映射,您可以选择完整的@OneToMany
/ @ManyToOne
映射,但在这种情况下,使用@ElementCollection
可能更有趣:
@Entity
@XmlRootElement(name = "node")
public class Node {
@Id
private int id;
private String name;
@ElementCollection
@CollectionTable(
name="NODE_ADDRESS",
joinColumns=@JoinColumn(name="NODE_ID")
)
@Column(name = "ADDRESS")
private List<String> address;
// Getters + Setters
}
由于Hibernate(默认的JPA提供程序)无法映射到数组,因此需要在List<String>
字段中使用address
。如果你不喜欢这个,你将不得不创建多个类,一个用于XML映射,另一个用于JPA映射。
注意:您缺少元素的映射,因此您还必须创建一个MainNode类。