JAXB Отображение циклических ссылок на XML

Вот что вы видите в окне «Часы»:

a = 0 = 0x00 = 0x0000 = 0x00 0000 = 0x0000 0000

b = 167772160 = 16777216 * 10 = 0x1000000 * 0x0A = 0xA000000

c = 655360 = 65536 * 10 = 0x10000 * 0x0A = 0xA0000

d = 10 = 0x0A = 0x0000 000A

Что это значит? Это означает, что ваш компилятор выполнил свою работу, но ваш отладчик читает c и b как двойные слова (4 байта) вместо байтов.

Когда он читает в b, он считывает свое значение 0x00, значение c 0x0000 и d сверху 0x0A, вместе сделав его 0xA000000.

Подобное происходит с c. a повезло, так как следующие 4 байта равны нулю, поэтому a действительно равен нулю.

Однако это не всегда так. Ничто не говорит о том, что после d не может быть никакого мусора, не говоря уже о том, что переменные, равные нулю, могут появляться в .bss (в совершенно другой ячейке памяти).

18
задан Jordan Allan 18 June 2010 в 22:07
поделиться

3 ответа

Преимущество использования 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, вам необходимо включить файл jaxb.properties в классы вашей модели (т.е. контракт) со следующей записью:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
13
ответ дан 30 November 2019 в 03:28
поделиться

Эта страница в «Неофициальном руководстве JAXB» предлагает три стратегии работы с циклами. Вот они (вкратце):

  • Отметьте один из ссылочных атрибутов, которые формируют цикл, как @XmlTransient.
  • Используйте @XmlID и @XmlIDREF, чтобы ссылки представлялись с использованием идентификаторов XML, а не путем включения.
  • Используйте интерфейс CycleRecoverable для программной обработки циклов.
17
ответ дан 30 November 2019 в 03:28
поделиться

просто посмотрите этот учебник: Отображение циклических ссылок на XML с помощью jaxb

Я использую его, и он хорошо работает :)

1
ответ дан 30 November 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: