我使用 JPA/Hibernate 作为我的持久性框架,并且我有以下实体层次结构:
@Entity
@Table(name = "node")
@XmlRootElement(name = "nodeMap")
@XmlAccessorType(XmlAccessType.FIELD)
public class NodeMapDTO {
@XmlElementWrapper(name = "ipAddresses")
@XmlElement(name = "ipAddress")
@OneToMany
@JoinColumn(name = "node_id")
private List<IPAddressDTO> ipAddresses;
[...]
}
@Entity
@Table(name = "node_ip_address")
@XmlAccessorType(XmlAccessType.FIELD)
public class IPAddressDTO {
@Column(name = "ip_address")
private String ipAddress;
[...]
}
当我将 NodeMapDTO 转换为 XML 时,我得到以下结果:
<nodeMap>
<ipAddresses>
<ipAddress>
<ipAddress>192.59.233.20</ipAddress>
</ipAddress>
</ipAddresses>
</nodeMap>
但我希望它是:
<nodeMap>
<ipAddresses>
<ipAddress>192.59.233.20</ipAddress>
</ipAddresses>
</nodeMap>
不幸的是,我需要我的 ipAddresses
字段是 IPAddressDTO
的列表s 而不是 String
因为否则我无法使用 @OneToMany 注释(不,出于性能原因我不想使用 @ElementCollection)。
我还想尝试在不必创建任何额外的包装类的情况下执行此操作。我想如果我为 List<IPAddressDTO> ipAddresses
创建一个包装类字段,我的 Hibernate 注释将不起作用,它只会使代码比需要的更加复杂。
谢谢大家。
最佳答案
使用@XmlValue
注释字段ipAddress
.
这是完整的 Minimal, Reproducible Example :
import java.util.*;
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
public class Test {
public static void main(String[] args) throws Exception {
Marshaller marshaller = JAXBContext.newInstance(NodeMapDTO.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(new NodeMapDTO(new IPAddressDTO("192.59.233.20")), System.out);
}
}
@XmlRootElement(name = "nodeMap")
@XmlAccessorType(XmlAccessType.FIELD)
public class NodeMapDTO {
@XmlElementWrapper(name = "ipAddresses")
@XmlElement(name = "ipAddress")
private List<IPAddressDTO> ipAddresses;
NodeMapDTO() {
}
NodeMapDTO(IPAddressDTO... ipAddresses) {
this.ipAddresses = Arrays.asList(ipAddresses);
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public class IPAddressDTO {
@XmlValue
private String ipAddress;
IPAddressDTO() {
}
IPAddressDTO(String ipAddress) {
this.ipAddress = ipAddress;
}
}
输出
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<nodeMap>
<ipAddresses>
<ipAddress>192.59.233.20</ipAddress>
</ipAddresses>
</nodeMap>
关于java - 编码时 JAXB 展平实体列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57781048/