Java JAXB在编组时展平实体列表

Java JAXB在编组时展平实体列表,java,hibernate,jpa,orm,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")

我使用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>
不幸的是,我需要让我的IPAddresss字段成为IPAddressDTO的列表,而不是字符串,因为否则我无法使用@OneToMany注释,不,出于性能原因,我不想使用@ElementCollection

我还想尝试这样做,而不必创建任何额外的包装器类。我认为如果我为ListIpaAddresses字段创建一个包装类,我的Hibernate注释将无法工作,它只会使代码比需要的复杂得多

谢谢大家。

用注释字段ipAddress

以下是全文:

导入java.util.*; 导入javax.xml.bind.*; 导入javax.xml.bind.annotation.*; 公开课考试{ 公共静态无效主字符串[]args引发异常{ Marshaller Marshaller=JAXBContext.newInstanceNodeMapDTO.class.createMarshaller; marshaller.setPropertyMarshaller.JAXB_格式化的_输出,true; marshaller.marshallnew NodeMapDTOnew ipaddress dto192.59.233.20,System.out; } } @XmlRootElementname=nodeMap @XmlAccessorTypeXmlAccessType.FIELD 公共类nodemapdo{ @XmlElementWrappername=IPAddresss @XmlElementname=ipAddress 私人名单地址; NodeMapDTO{ } NodeMapDTOIPAddressDTO…IP地址{ this.ipAddresses=Arrays.asListipAddresses; } } @XmlAccessorTypeXmlAccessType.FIELD 公共类IPAddressDTO{ @XmlValue 私有字符串IP地址; IPAddressDTO{ } ipAddress转发ipAddress{ this.ipAddress=ipAddress; } } 输出

192.59.233.20
这对我来说非常有效。非常感谢。如果其他人好奇,我还必须在IPAddressDTO.ipAddress字段的getter顶部添加一个@JsonValue注释,以使其适用于JSON。