- Часть 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).