You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用@XmlIDREF与@XmlID编组嵌套集合?

使用JAXB处理集合与实体关联的配置示例

我来整理一下你提到的JAXB相关配置和代码,方便你参考使用:

1. Maven依赖配置

首先是你用到的Jersey JAXB媒体模块依赖,在pom.xml中添加:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-jaxb</artifactId>
    <version>2.23.2</version>
</dependency>

2. 集合包装类定义

这个包装类用于将List<TrainingEntity>序列化为XML根元素<trainings>:

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "trainings")
public class ArrayListWrapper {
    private List<TrainingEntity> trainings = new ArrayList<>();

    // Getter方法
    public List<TrainingEntity> getTrainings() {
        return trainings;
    }

    // Setter方法
    public void setTrainings(List<TrainingEntity> trainings) {
        this.trainings = trainings;
    }
}

3. TrainingEntity中的关联属性配置

你提到的TrainingEntity类里使用@XmlIDREF和@XmlElementWrapper来处理与ArticleEntity的集合关联,示例代码如下:

import java.util.Set;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlIDREF;

public class TrainingEntity {
    // 其他属性...

    @XmlIDREF
    @XmlElementWrapper(name = "articles") // 可选:指定包装元素名,生成<articles>包裹子元素
    private Set<ArticleEntity> articles;

    // Getter和Setter方法
    public Set<ArticleEntity> getArticles() {
        return articles;
    }

    public void setArticles(Set<ArticleEntity> articles) {
        this.articles = articles;
    }
}

补充说明

  • @XmlRootElement(name = "trainings"):指定当前类在XML中的根元素名称为<trainings>,让JAXB能正确识别并序列化/反序列化整个集合包装对象。
  • @XmlIDREF:这个注解会让JAXB序列化时只输出关联实体的ID引用,而不是整个实体的XML内容,常用于处理实体间的关联关系,避免循环引用和冗余数据。注意对应的ArticleEntity类需要有一个用*@XmlID*标注的属性作为唯一标识。
  • @XmlElementWrapper:用于为集合属性生成一个包装元素,比如上面的配置会生成<articles>标签来包裹所有关联的实体引用元素,让XML结构更清晰。

内容的提问来源于stack exchange,提问作者Marcin Warycha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:09:43