Criar uma aplicação JPA2 com EclipseLink e H2 - Dei-Isep

Propaganda
Criar uma aplicação JPA2 com EclipseLink e H2 1) Criar uma aplicação Java no NetBeans. File > New Project > Java, Java Application > Project name: JPA2 Finish. 2) Acrescentar ao Projeto NetBeans a biblioteca para ligar à base de dados H2 Em projetos Java, as bibliotecas utilizadas precisam ficar registadas no classpath da aplicação. Criar um directório LIBS dentro do projecto para conter o ficheiro jar com o driver para H2: Bt. dir. do rato no projecto Java: New > Folder… > LIBS [Categories: Other, File Types: Folder] Este directório não fica visível no separador Projects. Mudar para o separador Files, copiar o ficheiro h2-1.3.175.jar e fazer paste em LIBS No separador Projects, bt. dir. do rato em Libraries > Add JAR/Folder… 
Seleccionar …/JPA2/LIBS/h2-1.3.175.jar (Relative Path) > Open 3) Criar Persistence Unit A Persistence Unit é necessária para criar um gestor de persistência Entity Manager encarregado de persistir qualquer alteração do estado dos objectos para a base de dados. Bt. dir. do rato no projecto > New > Persistence > Persistence Unit… Janela “New Persistence Unit”: Persistence Unit Name: Persistence Library: JPA2PU EclipseLink (JPA 2.1)
[Hibernate (JPA 2.0] Database Connection: Selecionar New Database Connection… Table Generation Strategy: Create
Na janela “New Connection Wizard”, Locate Driver, Em “Driver” selecionar org.h2.Driver Se esta opção não aparece é porque o driver H2 ainda não está registado no NetBeans. Então devemos seleccionar “New Driver…” para o registar. Next > Na janela “New Connection Wizard”, Customize Connection, “User Name:” e “Password:” podem ser deixados em branco. Antes de premir em “Test Connection” devemos preencher JDBC URL: Exemplo: JDBC URL: jdbc:h2:~/bd/Pessoas Nota: Não é possível colocar um caminho para a base de dados relativo ao diretório do projeto, pelo que se coloca um caminho relativo ao directório home, embora depois se vá alterar. Test Connection. Next > Na janela “New Connection Wizard”, Choose Database Schema, Select schema: PUBLIC Next > Na janela “New Connection Wizard”, Choose name for connection, Input connection name: ligacaoParaApagar Finish. Nas Libraries do projecto surgirão as seguintes bibliotecas: 


EclipseLink (JPA 2.1) – eclipselink-2.3.2.jar
EclipseLink (JPA 2.1) – javax.persistence-2.1.0.v201304241213.jar
EclipseLink (JPA 2.1) – org.eclipse.persistence.jpa.jpql_2.5.1. v20130918-f2b9fc5.jar O ficheiro persistence.xml criado dentro do directório META‐INF pode ser visualizado em modo Source ou Design. Vamos mudar o conteúdo de “JDBC Connection” de JDBC Connection: jdbc:h2:~/bd/Pessoas
JDBC Connection: jdbc:h2:./bd/Pessoas
para
Assim a base de dados fica com um caminho relativo ao projecto. No wizard usado anteriormente para criar a ligação à base de dados não foi possível colocar um caminho relativo ao projeto. No modo Design também não é possível mudar. No modo Source já é possível editar o ficheiro. No modo Source editar a linha: <property name="javax.persistence.jdbc.url" value="jdbc:h2:~/bd/Pessoas"/>
para <property name="javax.persistence.jdbc.url" value="jdbc:h2:./bd/Pessoas"/>
A base de dados ficará localizada debaixo do directório do projecto NetBeans (JPA2): …/JPA2/bd/Pessoas.h2.db
O ficheiro persistence.xml, ficheiro de configuração para aplicações JPA, pode ter definições para um conjunto de unidades de persistência. Cada unidade de persistência especifica o provider JPA, um conjunto de propriedades para configurar a fonte de dados, e define uma ou mais entidades managed que a instância Entity Manager de uma aplicação pode gerir (entidades definidas na próxima secção). O elemento <persistence-unit> contém a informação de configuração de uma fonte de dados. O atributo name especifica o nome da unidade de persistência que é necessário fornecer para criar a instância EntityManagerFactory. 4) Criar classe Entidade Bt. dir. do rato no projecto ou em Source Packages > New > Persistence > Entity Class… 


Class Name: Package:
Finish Pessoa
model Verificar que no ficheiro persistence.xml foi incluído o elemento <class>model.Pessoa</class> Acrescentar o seguinte código a Pessoa.java: @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
public Pessoa() {
}
public Pessoa(String nome) {
this.nome = nome;
}
public String getNome() {
return nome;
}
Mudar @GeneratedValue(strategy = GenerationType.AUTO)
para: @GeneratedValue(strategy = GenerationType.IDENTITY)
A estratégia AUTO é a estratégia por omissão, portanto @GeneratedValue(strategy = GenerationType.AUTO)
é equivalente a @GeneratedValue A estratégia AUTO usa o gerador “global number” para gerar uma chave primária para cada nova entidade. Estes valores gerados são únicos ao nível da base de dados e nunca reciclados. A estratégia IDENTITY é semelhante à AUTO, a diferença é que usa um gerador Identity separado para cada tipo hierarquia, portanto os valores gerados são únicos só por hierarquia. 5) Colocar o seguinte código no método main: public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("JPA2PU");
EntityManager em = emf.createEntityManager();
Pessoa p1 = new Pessoa("Manuel");
em.getTransaction().begin();
em.persist(p1);
em.getTransaction().commit();
System.out.println("ID gerado: " + p1.getId());
em.close();
emf.close();
}
Executar o programa. 6) Ver o conteúdo da base de dados No separador “Services” apagar a ligação obtida durante a criação da Persistence Unit: Bt. dir. do rato em ligacaoParaApagar > Disconnect, Delete A base de dados obtida durante a criação da Persistence Unit ficou com um caminho relativo ao directório home (~/bd/Pessoas), enquanto que a base de dados criado durante a execução do programa tem um caminho relativo ao projecto (./bd/Pessoas). Assim a ligação existente em “Services” – ligacaoParaApagar – não nos serve para nada e para ver o conteúdo da base de dados temos de criar uma nova ligação à base de dados criada pelo programa. No separador “Services” criar um ligação para a base de dados: Databases > New Connection… > Driver: org.h2.Driver Next Na janela “New Connection Wizard”, Customize Connection, JDBC URL: jdbc:h2:C:\Users\Fernando\Documents\NetBeansProjects\JPA2\bd\Pessoas
Ou
jdbc:h2:~\Documents\NetBeansProjects\JPA2\bd\Pessoas
É necessário indicar o caminho absoluto ou um caminho relativo a partir do directório home. Test Connection. Next > Na janela “New Connection Wizard”, Choose Database Schema, Select schema: PUBLIC Next > Na janela “New Connection Wizard”, Choose name for connection, Input connection name: ligacaoBaseDadosPessoas Finish. Expandir o objecto ligacaoBaseDadosPessoas > PUBLIC > Tables > PESSOA Bt. dir. do rato > View Data… 7) Executar o programa mantendo uma ligação aberta para a base de dados Dá o seguinte erro: Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink‐4002] (Eclipse Persistence Services ‐ 2.5.1.v20130918‐f2b9fc5): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: org.h2.jdbc.JdbcSQLException: Database may be already in use: "Locked by another process". Possible solutions: close all other connection(s); use the server mode [90020‐175] Error Code: 90020 É necessário fechar a ligação no separador Services: Bt. dir do rato na ligação: Disconnect 8) Alteração do ficheiro persistence.xml para mostrar as instruções SQL executadas As opções de logging são específicas do Provider. Para o EclipseLink acrescentar ao elemento properties do documento persistence.xml as 2 linhas seguintes (a primeira para mostrar as instruções SQL, e a segunda para mostrar os valores dos parâmetros SQL): <property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
Executar o programa. 
Download