java - 编码时 JAXB 展平实体列表

标签 java hibernate jpa orm jaxb

我使用 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/

相关文章:

java - JPA + hibernate 环境

java - Spring Roo 更新密码字段或不更新所有字段

java - 后缀自赋值行为是否在 C#/Java 中严格定义?

java - 为什么一对一双向关联需要LEFT OUTER Join

java - 如何在显示JSP后执行hibernate session.close()以避免lazy=false

java - 中间表和非主键的一对一映射

postgresql - 查询 : JpaRepository 的验证失败

javascript - Wicket 调用 AjaxRequestTarget 内的 Javascript 函数

java - Android 应用程序的 android.os.NetworkOnMainThreadException

java - 如何使用 HQL(Hibernate 查询语言)获取列的最后一个值