Contêineres no servidor de aplicativos podem fornecer muitas das funções necessárias para a JPA (Java™ Persistence API) em um ambiente Java Enterprise
Edition (Java EE). O servidor de aplicativos também fornece ferramentas de comando JPA para ajudá-lo a
desenvolver aplicativos em um ambiente Java EE.
Sobre Esta Tarefa
Atenção: Ao usar estas ferramentas de comando JPA, execute-as a partir do diretório <
profile_root>/bin, em vez de a partir do diretório
app_server_root/bin para certificar-se de que você possui a versão mais recente dos comandos para o seu nível de release.
Para essa tarefa, você deve especificar o arquivo Java archive (JAR) independente com.ibm.ws.jpa-2.1.thinclient_9.0.jar no caminho de classe para compilação com relação às interfaces JPA 2.1. Para compilar com relação às interfaces JPA 2.0, especifique o com.ibm.ws.jpa-2.0.thinclient_9.0.jar. Este arquivo JAR independente está disponível a partir das imagens de instalação. O local desses arquivos na imagem de instalação do servidor está no diretório ${app_server_root}/runtimes.
Importante: Os aplicativos JPA exigem técnicas de configuração diferentes dos aplicativos que utilizam persistência gerenciada por contêiner (CMP) ou persistência
gerenciada por bean (BMP). Eles não seguem as técnicas típicas de implementação que estão associadas a aplicativos que implementam CMP ou BMP.
Em aplicativos JPA, você deve definir uma unidade de persistência e configurar as propriedades adequadas para garantir que os aplicativos possam executar em um ambiente Java EE.
O contêiner suporta todas as injeções necessárias para garantir que os aplicativos executem no ambiente Java EE. Por exemplo, o contêiner pode injetar @PersistenceUnit
e @PersistenceContext em seus aplicativos.
- Gerar suas classes de entidades. Estas são as entidades
Plain Old Java Object (POJO).
Dependendo do modelo de desenvolvimento, você pode usar algumas ou todas as ferramentas de JPA:
- Mapeamento de cima para baixo: Você começa do início com as definições de entidade e os mapeamentos relacionais do objeto e, em seguida, deriva os esquemas dos bancos de dados a partir desses dados. Se você utilizar essa abordagem, provavelmente cuidará da criação da arquitetura do modelo do objeto e, em seguida, gravará suas classes de entidade. Essas classes de entidade eventualmente determinariam a criação do seu modelo de banco de dados. Se você estiver utilizando um mapeamento de cima para baixo do modelo de objeto para o modelo relacional, desenvolva as classes de entidades e, em seguida, utilize a funcionalidade do provedor JPA para gerar as tabelas de banco de dados que são baseadas nas classes de entidades. A ferramenta wsmapping ajuda com essa abordagem ao usar OpenJPA como o provedor de persistência.
- Mapeamento de baixo para cima: Você inicia com o modelo de dados, que são os esquemas de bancos de dados e, em seguida, trabalha para cima em suas classes de entidade. A ferramenta wsreversemapping ajuda com essa abordagem ao utilizar OpenJPA como o provedor de persistência.
- Mapeamento de encontro no meio: provavelmente o modelo de desenvolvimento mais comum. Você tem uma combinação do modelo de dados e o modelo de objeto parcialmente concluído. Dependendo dos objetivos e dos requisitos, você deve negociar os relacionamentos para resolver quaisquer diferenças. Tanto a ferramenta wsmapping quanto a ferramenta wsreversemapping ajudam com essa abordagem ao utilizar o OpenJPA como provedor de persistência.
A solução JPA para o servidor de aplicativos fornece várias ferramentas que ajudam no desenvolvimento de aplicativos JPA. Combinar
essas ferramentas com o IBM® Rational Application
Developer fornece um ambiente de desenvolvimento sólido para aplicativos Java EE
ou
Java
SE. O Rational Application
Developer inclui ferramentas da GUI para inserir anotações, um editor de arquivo
persistence.xml customizado, um explorador de banco de dados e outros recursos. Outra
alternativa é o projeto Eclipse Dali. Informações adicionais sobre oRational Application Developer ou o plug-in Eclipse Dali podem ser localizadas em seus respectivos Web sites.
- Compile as classes de entidade.
Compile as entidades como você faria com qualquer classe Java, a menos que esteja usando a API de Critérios. Se você estiver usando o Criteria API, também deverá gerar as classes de metamodelos da Criteria API.
A seguir estão exemplos
de como usar esta opção.
Usando o EclipseLink, forneça os argumentos a seguir com o comando
javac:
-processor
org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
-Aeclipselink.persistencexml= persistence.xml_location
app_server_root/java/bin/javac
-classpath app_server_root/runtimes/com.ibm.ws.jpa-2.1.thinclient_9.0.0.jar
-processor
org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
-Aeclipselink.persistencexml=app_location/src/META-INF/persistence.xml mypackage\MyEntity.java
Usando o OpenJPA ou WSJPA, forneça os argumentos a seguir com o comando
javac:
-Aopenjpa.metamodel=true
app_server_root/java/bin/javac
-Aopenjpa.metamodel=true
-classpath app_server_root/runtimes/com.ibm.ws.jpa-2.0.thinclient_9.0.0.jar
mypackage/MyEntity.java
- Aprimore as classes de entidades usando a ferramenta otimizadora JPA, eclenhancer para EclipseLink e wsenhancer para OpenJPA. Um otimizador é uma ferramenta que inclui bytecode de integração específico do provedor para as classes persistentes depois delas terem sido gravadas. O otimizador pós-processa o bytecode que é gerado pelo compilador Java e inclui os campos e os métodos necessários para implementar os recursos de persistência. Embora o provedor de persistência do servidor de aplicativos possa aprimorar automaticamente as entidades no tempo de execução, você obterá um desempenho melhor se puder aprimorar as entidades ao construir o aplicativo. O aplicativo não tenta aprimorar
entidades que já estão aprimoradas.
Para obter exemplos de como usar a ferramenta eclenhancer, consulte o tópico Comando eclenhancer. Para obter exemplos de como usar a ferramenta wsenhancer, consulte o tópico Comando wsenhancer.
- Opcional: Se você não estiver utilizando o modelo de desenvolvimento para mapeamento bottom-up, gere ou atualize as tabelas de bancos de dados automaticamente ou utilizando a ferramenta eclenhancer ou wsmapping.
- Por padrão, o mapeamento de objeto relacional não ocorre automaticamente, mas é possível configurar o servidor de aplicativos para fornecer esse mapeamento com a propriedade eclipselink.ddl-generation do EclipseLink, ou a propriedade openjpa.jdbc.SynchronizeMappings para OpenJPA. Essas propriedades podem acelerar o desenvolvimento assegurando automaticamente que as tabelas de banco de dados correspondam ao modelo de objeto. Para ativar o mapeamento automático, inclua a seguinte linha no arquivo persistence.xml:
Para EclipseLink:
<property name="eclipselink.ddl-generation" value =“create-tables”/>
Para OpenJPA:
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
Padrão de JPA 2.1:
<property name="javax.persistence.schema-generation.database.action" value="create"/>
Evitar Problemas: Para ativar o mapeamento relacional de objetos automático no tempo de execução, todas as classes persistentes devem ser listadas no arquivo Java .class, no arquivo de mapeamento e nos elementos do arquivo JAR (Java archive) no formato XML.
gotcha
- Para atualizar ou gerar manualmente suas tabelas de bancos de dados, execute a ferramenta de mapeamento de JPA para o servidor de aplicativos a partir da linha de comandos para criar as tabelas do banco de dados. Para obter exemplos de como executar a ferramenta eclenhancer, consulte o tópico Comando eclenhancer. Para obter exemplos de como usar a ferramenta wsmapping, consulte o tópico Comando wsmapping.
- Opcional: Se você estiver utilizando o OpenJPA e DB2 e desejar usar a Structured Query Language (SQL) estática, execute o comando wsdbgen. Para usar o comando wsdbgen, o IBM Optim PureQuery Run Time deve ser instalado. O comando wsdbgen cria o arquivo persistence_unit_name.pdqxml
no mesmo diretório META-INF no qual o arquivo persistence.xml está localizado. Se possuir diversas unidades de persistência, o comando wsdbgen deverá ser executado para cada unidade de persistência.
Quando diversos arquivos pdqxml estiverem referenciados por um
aplicativo, use o utilitário Merge para combiná-los
em um arquivo pdqxml único.
Especifique o arquivo
pdqxml combinado como uma propriedade pureQueryXml
de pdqProperties.
Consulte a documentação do utilitário Merge no Centro de Informações do IBM Integrated Data Management.
Evitar Problemas: Os aplicativos que implementam
o JPA e estão configurados para executar SQL estática podem ter várias exceções. Essas exceções podem ocorrer com o comando
wsdbgen, que pode ser usado para preparar
o aplicativo ou quando o aplicativo estiver em execução e chamar um método JPA. Para resolver este problema,
conclua as seguintes etapas:
- Instale as program temporary fixes (PTF) para o Driver iSeries JDBC V5R4. Instale PTF números SI32561 e SI32562. É possível localizar os PTFs por meio do Web site IBM System
i Support: PTF Cover Letters.
- Se você usar o DB2
Universal Database para iSeries V6R1 ou V5R3, visite o Web site de correção para o release apropriado.
- Instale o nível necessário de pureQuery, que é da Versão 1.3.100 ou posterior. Para obter mais informações, consulte o Web site IBM Optim
pureQuery Runtime.
Instale o mais recente driver JCC, que é da Versão 3.52.95 ou posterior, com a correção para APAR PK65069. Os drivers JCC mais recentes fazem parte do pacote de software IBM DB2.
- Para DB2 em um servidor z/OS, instale a PTF UK39204 para o driver alternativo V8
ou a PTF UK39205 para V9, e instale a correção para o APAR
PK67706.
gotcha
Para obter exemplos de como executar este comando, consulte o tópico
Comando wsdbgen.
- Opcional: Se você estiver usando o OpenJPA e a identidade gerenciada por aplicativo, gere uma classe de identidade gerenciada por aplicativo com a ferramenta wsappid. Ao usar uma identidade gerenciada por aplicativo, um ou mais dos campos deve ser um campo de identidade. Utilize uma classe de identidade se sua entidade tiver vários campos de identidade e pelo menos um dos campos estiver relacionado à outra entidade. A ferramenta de identidade gerenciada pelo aplicativo gera o código Java que usa a classe de identidade para qualquer tipo persistente que implementa a identidade gerenciada pelo aplicativo.
Para obter exemplos de como usar a ferramenta wsappid,
consulte o tópico Comando wsappid.
Exemplo
A seguir está um exemplo de um arquivo
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd” ">
<persistence-unit name="TheWildZooPU" transaction-type="JTA">
<jta-data-source>jdbc/DataSourceJNDI</jta-data-source>
<!-- additional Mapping file, in addition to orm.xml>
<mapping-file>META-INF/JPAorm.xml</mapping-file>
<class>com.company.bean.jpa.PersistebleObjectImpl</class>
<class>com.company.bean.jpa.Animal</class>
<class>com.company.bean.jpa.Dog</class>
<class>com.company.bean.jpa.Cat</class>
<properties>
<property name=”eclipselink.ddl-generation”
value=”create-tables”/>
</properties>
</persistence-unit>
</persistence>