当前位置: 首页 > 面试题库 >

JAXB将循环引用映射到XML

谈琛
2023-03-14
问题内容

我有一个包含循环的对象图。我如何让JAXB处理呢?我尝试@XmlTransient在子类中使用批注,但JAXB编组器仍检测到周期。

@Entity
@XmlRootElement
public class Contact {

    @Id
    private Long contactId;

    @OneToMany(mappedBy = "contact")
    private List<ContactAddress> addresses;

...

}

@Entity
@XmlRootElement
public class ContactAddress {

    @Id
    private Long contactAddressId;

    @ManyToOne
    @JoinColumn(name = "contact_id")
    private Contact contact;

    private String address;

...

}

问题答案:

使用JAXB的好处是它是具有多个实现的标准运行时(就像JPA一样)。

如果使用EclipseLink JAXB(MOXy),则可以使用许多扩展来处理JPA实体,包括双向关系。这是使用MOXy
@XmlInverseReference批注完成的。它的作用类似于元帅上的@XmlTransient,并在元帅上填充目标与源的关系。

http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JPA/Relationships

@Entity 
@XmlRootElement 
public class Contact {

    @Id 
    private Long contactId;

    @OneToMany(mappedBy = "contact") 
    private List<ContactAddress> addresses;

...

}

@Entity 
@XmlRootElement 
public class ContactAddress {

    @Id 
    private Long contactAddressId;

    @ManyToOne 
    @JoinColumn(name = "contact_id") 
    @XmlInverseReference(mappedBy="addresses")
    private Contact contact;

    private String address;

...

}

其他扩展可用,包括对复合键和嵌入式键类的支持。

要指定EcliseLink MOXy JAXB实现,您需要在模型类(即Contract)中包含jaxb.properties文件,并具有以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory


 类似资料:
  • 问题内容: 我已经编写了一个JAX-RS(Jersey)REST服务,该服务接受ONIX XML格式的XML消息。通常,我已经使用xjc从给定架构生成了JAXB绑定所需的所有类。总体上有500多个类,我无法对其进行修改。 现在,当我有一个JAXB映射的对象时,我需要将其存储到数据库中。我使用mongoDb,因此消息格式应为JSON。我试图将Jackson与JAXB模块一起使用,以将JAXB对象转换

  • 我有一个父类和子类,其各自的DTO如下 当我试图将父映射到父映射到父映射到父映射时,我得到了堆栈溢出错误。 请帮我解决这个问题。

  • 问题内容: 我一直在尝试创建Jersey REST Web服务。我想从Java类接收和发出JSON对象,如下所示: 应该这样将其转换为JSON: 但是,我找不到为此的标准解决方案。似乎每个人都在实现自己的包装器 解决方案。这个要求对我来说似乎是最基本的。我不敢相信这是普遍接受的解决方案,尤其是因为Jersey确实是Java中更有趣的部分之一。 我还尝试了升级到Jackson 1.8,这仅给了我这一

  • 我从一个xml模式生成java类,对于一个复杂类型,我希望jaxb使用一个现有的类,我有一个外部绑定定制文件。自定义类被解组为正确的,除了该类型的单个属性,该属性从未在java类中填充。 下面是类型/类问题的演示。 模式中定义的内容是: 读取匹配xml文件的代码段是: 在这个xml中阅读: 使用JAXB生成的Thing类(不使用自定义xjb),输出符合预期: 使用只有getters的自定义Thin

  • 问题内容: 我正在寻找一种确定范围的方法 。 Golang规范指出以下内容: 未指定地图的迭代顺序,并且不能保证每次迭代之间都相同。如果在迭代过程中删除尚未到达的映射条目,则不会生成相应的迭代值。如果映射条目是在迭代过程中创建的,则该条目可能在迭代过程中产生或可以被跳过。对于创建的每个条目以及从一个迭代到下一个迭代,选择可能有所不同。如果映射为nil,则迭代次数为0。 我在StackOverflo

  • 在映射上分配一些默认值 我知道我需要在地图中添加值 问题是我的循环不起作用。我需要从地图中添加value2,基于从那里的位置或从地图中添加value2