以下は、永続性にJPAを使用し、メッセージングにJAXBを使用してセッションBeanとして実装されたJAX-RSサービスの例です。(EntityManager
セッションBeanにanが注入されていることに注意してください。なぜ、この種の動作を避けたいのですか?):
package org.example;
import java.util.List;
import javax.ejb.*;
import javax.persistence.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {
@PersistenceContext(unitName="CustomerService",
type=PersistenceContextType.TRANSACTION)
EntityManager entityManager;
@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(Customer customer) {
entityManager.persist(customer);
}
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("{id}")
public Customer read(@PathParam("id") long id) {
return entityManager.find(Customer.class, id);
}
@PUT
@Consumes(MediaType.APPLICATION_XML)
public void update(Customer customer) {
entityManager.merge(customer);
}
@DELETE
@Path("{id}")
public void delete(@PathParam("id") long id) {
Customer customer = read(id);
if(null != customer) {
entityManager.remove(customer);
}
}
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("findCustomersByCity/{city}")
public List<Customer> findCustomersByCity(@PathParam("city") String city) {
Query query = entityManager.createNamedQuery("findCustomersByCity");
query.setParameter("city", city);
return query.getResultList();
}
}
サーバー側とクライアント側で同じドメインオブジェクトを使用する場合。次に、クライアントでのクラスパスの依存関係を回避するために、アノテーションではなくXMLを介してJPAマッピングを提供します。
詳細については
アップデート
META-INF / persistence.xml
persistence.xmlファイルは、JPAマッピングを含むXMLファイルへのリンクを指定する場所です。
<persistence-unit name="CustomerService" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>CustomerService</jta-data-source>
<mapping-file>META-INF/orm.xml</mapping-file>
</persistence-unit>
META-INF / orm.xml
このファイルに、JPAメタデータの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>
詳細については