Статьи

Создание веб-службы RESTful: метаданные XML

Java Persistence Architecture (JPA) — это стандарт Java EE для отображения POJO в реляционную базу данных. В этом примере мы будем использовать JPA для взаимодействия с данными нашей базы данных, которые мы настроили в первой  части . В предыдущем посте  мы указали метаданные сопоставления в качестве аннотаций. Этот пост продемонстрирует, как указать те же метаданные, что и XML. Одно из преимуществ определения метаданных в виде XML состоит в том, что доменные объекты не будут зависеть от API JPA. Это полезно, если мы хотим использовать одни и те же классы домена на стороне клиента.

META-INF / orm.xml 

JPA предоставляет стандартное представление метаданных в формате XML. Метаданные ниже те же, что были указаны в аннотациях в
предыдущем посте . Если вы назовете файл метаданных XML
orm.xml и поместите его в
каталог
META-INF, реализация JPA автоматически применит его. Если вы выберете альтернативное имя или местоположение, вам нужно будет настроить это в
файле
persistence.xml .

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
    version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">
    <entity class="org.example.Customer">
         <named-query name="findCustomersByCity">
            <query>SELECT c FROM Customer c WHERE c.address.city = :city</query>
         </named-query>
         <attributes>
            <id name="id"/>
            <basic name="firstName">
                <column name="FIRST_NAME"/>
            </basic>
            <basic name="lastName">
                <column name="LAST_NAME"/>
            </basic>
            <one-to-many name="phoneNumbers" mapped-by="customer">
                <cascade>
                    <cascade-all/>
                </cascade>
            </one-to-many>
            <one-to-one name="address" mapped-by="customer">
                <cascade>
                    <cascade-all/>
                </cascade>
            </one-to-one>
         </attributes>
    </entity>
    <entity class="org.example.Address">
        <attributes>
            <id name="id"/>
            <one-to-one name="customer">
                <primary-key-join-column/>
            </one-to-one>
        </attributes>
    </entity>
    <entity class="org.example.PhoneNumber">
        <table name="PHONE_NUMBER"/>
        <attributes>
            <id name="id"/>
            <many-to-one name="customer">
                <join-column name="ID_CUSTOMER"/>
            </many-to-one>
        </attributes>
    </entity>
</entity-mappings>

 

META-INF / persistence.xml 
Для этого примера я буду использовать реализацию EclipseLink JPA . Если вы используете другую реализацию JPA, конфигурация будет немного отличаться.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="CustomerService"
    transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>CustomerService</jta-data-source>
        <properties>
            <property name="eclipselink.target-database" value="Oracle" />
            <property name="eclipselink.logging.level" value="FINEST" />
            <property name="eclipselink.logging.level.ejb_or_metadata" value="WARNING" />
            <property name="eclipselink.logging.timestamp" value="false" />
            <property name="eclipselink.logging.thread" value="false" />
            <property name="eclipselink.logging.session" value="false" />
            <property name="eclipselink.logging.exceptions" value="false" />
            <property name="eclipselink.target-server" value="SunAS9" />
        </properties>
    </persistence-unit>
</persistence> 
JPA Entities 

Ниже приведена модель нашего домена. Поскольку метаданные предоставляются через XML-документ, мы не требуем никаких аннотаций.

Клиент
package org.example;
  
import java.io.Serializable;
import java.util.Set;
  
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;
  
    private long id;
  
    private String firstName;
  
    private String lastName;
  
    private Address address;
  
    private Set<PhoneNumber> phoneNumbers;
  
    public long getId() {
        return this.id;
    }
  
    public void setId(long id) {
        this.id = id;
    }
  
    public String getFirstName() {
        return this.firstName;
    }
  
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
  
    public String getLastName() {
        return this.lastName;
    }
  
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
  
    public Address getAddress() {
        return this.address;
    }
  
    public void setAddress(Address address) {
        this.address = address;
    }
      
    public Set<PhoneNumber> getPhoneNumbers() {
        return this.phoneNumbers;
    }
  
    public void setPhoneNumbers(Set<PhoneNumber> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }
 
}
Адрес 
package org.example;
  
import java.io.Serializable;
  
public class Address implements Serializable {
    private static final long serialVersionUID = 1L;
  
    private long id;
  
    private String city;
  
    private String street;
  
    private Customer customer;
  
    public long getId() {
        return this.id;
    }
  
    public void setId(long id) {
        this.id = id;
    }
  
    public String getCity() {
        return this.city;
    }
  
    public void setCity(String city) {
        this.city = city;
    }
  
    public String getStreet() {
        return this.street;
    }
  
    public void setStreet(String street) {
        this.street = street;
    }
  
    public Customer getCustomer() {
        return customer;
    }
  
    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
  
}
Номер телефона 
package org.example;
  
import java.io.Serializable;
  
public class PhoneNumber implements Serializable {
    private static final long serialVersionUID = 1L;
  
    private long id;    
    private String num;
    private String type;
  
    private Customer customer;
  
    public long getId() {
        return this.id;
    }
  
    public void setId(long id) {
        this.id = id;
    }
  
    public String getNum() {
        return this.num;
    }
  
    public void setNum(String num) {
        this.num = num;
    }
  
    public String getType() {
        return this.type;
    }
  
    public void setType(String type) {
        this.type = type;
    }
  
    public Customer getCustomer() {
        return this.customer;
    }
  
    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
 
}

Упаковка / развертывание

В конечном итоге мы упакуем META-INF / pesistence.xml, META-INF / orm.xml и наши объекты JPA в файл JAR. Мы фактически приостановим создание JAR, пока не применим представление XML с использованием JAXB в части 3 .


Следующие шаги

В следующем посте мы рассмотрим, как использовать архитектуру Java для привязки XML (JAXB) для применения представления XML к сущностям JPA (POJO).