Сопоставление XML с сущностями jpa с использованием JAXB - PullRequest
1 голос
/ 06 декабря 2011

Разве невозможно сопоставить xml сущностям jpa, используя JAXB? Поможет ли Eclipselink Moxy?

1 Ответ

4 голосов
/ 06 декабря 2011

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222 ) экспертная группа.

Да, вы можете отобразить сущности JPA в XML, и вот несколько способов, которыми EclipseLink JAXB (MOXy) делает это проще.

1. Двунаправленные сопоставления

Клиент

import javax.persistence.*;

@Entity
public class Customer {

    @Id
    private long id;

    @OneToOne(mappedBy="customer", cascade={CascadeType.ALL})
    private Address address;

}

Адрес

import javax.persistence.*;
import org.eclipse.persistence.oxm.annotations.*;

@Entity
public class Address implements Serializable {

    @Id
    private long id;

    @OneToOne
    @JoinColumn(name="ID")
    @MapsId
    @XmlInverseReference(mappedBy="address")
    private Customer customer;

}

Для получения дополнительной информации

2. Сопоставление составных ключевых связей

Обычно мы думаем о отображении дерева объектов в XML, однако JAXB поддерживает использование комбинации @XmlID / @XmlIDREF для сопоставления отношений между узлами, представляющими график. Стандартный механизм - это один ключ, один внешний ключ. JPA поддерживает концепцию составных ключей, как и MOXy, используя @XmlKey и @XmlJoinNodes (аналогично @XmlJoinColumns в JPA).

Employee

@Entity
@IdClass(EmployeeId.class)
public class Employee {

    @Id
    @Column(name="E_ID")
    @XmlID
    private BigDecimal eId;

    @Id
    @XmlKey
    private String country;

    @OneToMany(mappedBy="contact")
    @XmlInverseReference(mappedBy="contact")
    private List<PhoneNumber> contactNumber;

}

PhoneNumber

@Entity
public class PhoneNumber {

    @ManyToOne
    @JoinColumns({
        @JoinColumn(name="E_ID", referencedColumnName = "E_ID"),
        @JoinColumn(name="E_COUNTRY", referencedColumnName = "COUNTRY")
    })
    @XmlJoinNodes( {
        @XmlJoinNode(xmlPath="contact/id/text()", referencedXmlPath="id/text()"),
        @XmlJoinNode(xmlPath="contact/country/text()", referencedXmlPath="country/text()")
    })
    private Employee contact;

}

Для получения дополнительной информации

3. MOXy допускает использование составных и встроенных ключей

JPA также может использовать встроенные классы ключей для представления составных ключей. MOXy также поддерживает этот стиль составных ключей.

Для получения дополнительной информации

4. EclipseLink JAXB (MOXy) и EclipseLink JPA имеют общие концепции

EclipseLink предоставляет реализации JAXB и JPA, которые имеют общее ядро. Это означает, что они имеют много общих понятий, таких как:

Методы виртуального доступа

EclipseLink поддерживает концепцию виртуальных свойств. Это полезно при создании мультитенантного приложения, в котором вы хотите индивидуальные настройки. Эта концепция поддерживается в реализациях EclipseLink JPA и JAXB.

...