- Часть 1 — База данных
- Часть 2 — Отображение базы данных на объекты JPA
- Часть 3. Отображение сущностей JPA в XML (с использованием JAXB)
- Часть 4 — RESTful Service
- Часть 5 — Клиент
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>
<?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>
Ниже приведена модель нашего домена. Поскольку метаданные предоставляются через 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).