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: JPA2PU Persistence Library: EclipseLink (JPA 2.1) [Hibernate (JPA 2.0] Database Connection: Table Generation Strategy: Selecionar New Database Connection 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 para JDBC Connection: jdbc:h2:./bd/pessoas 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: Pessoa Package: model Finish 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 para: @GeneratedValue(strategy = GenerationType.AUTO) @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.