当前位置:  开发笔记 > 编程语言 > 正文

JAXB映射对XML的循环引用

如何解决《JAXB映射对XML的循环引用》经验,为你挑选了3个好方法。

我有一个包含循环的对象图.我如何让JAXB来处理这个问题?我尝试@XmlTransient在子类中使用注释,但JAXB编组仍然检测到循环.

@Entity
@XmlRootElement
public class Contact {

    @Id
    private Long contactId;

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

...

}

@Entity
@XmlRootElement
public class ContactAddress {

    @Id
    private Long contactAddressId;

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

    private String address;

...

}

Stephen C.. 17

"非官方JAXB指南"中的这个页面提供了三种处理周期的策略.它们(摘要):

将形成循环的参考属性之一标记为@XmlTransient.

使用@XmlID和@XmlIDREF,以便使用XML ID表示引用,而不是使用包含.

使用CycleRecoverable接口以编程方式处理周期.


bdoughan.. 13

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

如果您使用EclipseLink JAXB(MOXy),那么您可以使用许多扩展来处理JPA实体,包括双向关系.这是使用MOXy @XmlInverseReference批注完成的.它与marshal上的@XmlTransient类似,并在unmarshal上填充目标到源的关系.

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

@Entity 
@XmlRootElement 
public class Contact { 

    @Id 
    private Long contactId; 

    @OneToMany(mappedBy = "contact") 
    private List 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

jaxb.properties是一个带有一个属性的文本文件,需要将其添加到与实体类相同的包中:http://bdoughan.blogspot.com/2010/08/creating-restful-web-service-part-35 html的 (2认同)


小智.. 6

XMLTransient几乎总是适用于循环.您可能在字段级别上具有XMLTransient,但尚未将XMLAccessorType指定为XmlAccessType.Field.如果您没有指定任何内容,则默认值为XmlAccessType.Property - 或者您的getter.我已经体验过Jaxb从类中获取xml元素,我错过了访问者类型注释,并且仍然可以正常工作.



1> Stephen C..:

"非官方JAXB指南"中的这个页面提供了三种处理周期的策略.它们(摘要):

将形成循环的参考属性之一标记为@XmlTransient.

使用@XmlID和@XmlIDREF,以便使用XML ID表示引用,而不是使用包含.

使用CycleRecoverable接口以编程方式处理周期.



2> bdoughan..:

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

如果您使用EclipseLink JAXB(MOXy),那么您可以使用许多扩展来处理JPA实体,包括双向关系.这是使用MOXy @XmlInverseReference批注完成的.它与marshal上的@XmlTransient类似,并在unmarshal上填充目标到源的关系.

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

@Entity 
@XmlRootElement 
public class Contact { 

    @Id 
    private Long contactId; 

    @OneToMany(mappedBy = "contact") 
    private List 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


jaxb.properties是一个带有一个属性的文本文件,需要将其添加到与实体类相同的包中:http://bdoughan.blogspot.com/2010/08/creating-restful-web-service-part-35 html的

3> 小智..:

XMLTransient几乎总是适用于循环.您可能在字段级别上具有XMLTransient,但尚未将XMLAccessorType指定为XmlAccessType.Field.如果您没有指定任何内容,则默认值为XmlAccessType.Property - 或者您的getter.我已经体验过Jaxb从类中获取xml元素,我错过了访问者类型注释,并且仍然可以正常工作.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有