Como implementar a JPA

Fala pessoal andei lendo lendo um pouco sobre a JPA.
Sei que pra utilizar preciso de um provedor. Que pode ser o hibernate, mas não achei nada muito preciso. Alguem pode me passar algo mais completo sobre o assunto?

Boa essa mesmo, eu tbm tenho lido alguns artigos sobre JPA utilizando provedores via HIBERNATE e TOPLINK ESSENTIALS, porém alguns deles achei um tanto confuso não na implementação do código até mas em sua formação completa.
Bem aproveitando eu sei que JPA pode ser utilizado fora da especificação EJB 3.0 alguem poderia passar um exemplo simples, falando todos os componentes, downloads e tudo mais para fazer apenas uma classe simples(pode ser uma classe de clientes) ou 2 com os seus relacionamentos?
Tenho bastante conhecimento de teoria e pouca prática, se alguem puder esclarecer melhor esse assunto eu tbm agradeceria obrigado!

Galera, é bom ler o livro “Java Persistence With Hibernate” da editora Manning. Bom, para utilizar JPA, vc precisa de um provedor. Conheço alguns, mas os mais legais são realmnete o Hibernate e o Oracle TopLink essencials. Estes geralmente implementa, o padrão JPA e o extendem, adicionando recursos adicionais específicos. Se eu tiver algum código por aki eu posto jajá…

[code]import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**

  • Classe de entidade Usuario

  • @author orlando.patriarcha
    */
    @Entity
    @Table(name = “Usuario”)
    @NamedQueries( {
    @NamedQuery(name = “Usuario.findById”, query = “SELECT u FROM Usuario u WHERE u.id = :id”),
    @NamedQuery(name = “Usuario.findByNome”, query = “SELECT u FROM Usuario u WHERE u.nome = :nome”),
    @NamedQuery(name = “Usuario.findBySobrenome”, query = “SELECT u FROM Usuario u WHERE u.sobrenome = :sobrenome”),
    @NamedQuery(name = “Usuario.findByIdade”, query = “SELECT u FROM Usuario u WHERE u.idade = :idade”)
    })
    public class Usuario implements Serializable {

    @Id
    @Column(name = “id”, nullable = false)
    private int id;

    @Column(name = “nome”)
    private String nome;

    @Column(name = “sobrenome”)
    private String sobrenome;

    @Column(name = “idade”)
    private int idade;

    métodos get/set

[/code]

Esse é um pojo anotado com JPA.

E esse é um Persistence.xml (PU)

<persistence-unit name="PersistenceUnitTeste" transaction-type="RESOURCE_LOCAL">
    <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
    <properties>
      <property name="toplink.jdbc.url" value="jdbc:derby://localhost:1527/users"/>
      <property name="toplink.jdbc.user" value="user"/>
      <property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="toplink.jdbc.password" value=""/>
      <property name="toplink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

espero poder ter ajudado…

blz?

Bem vou tentar ser um pouco mais especifico na criação de um JPA mas infelizmente ainda estou estudando os componentes não posso dizer com 100% de certeza oque cada um faz, então só irei complementar o exemplo do nosso amigo tudo bem…

Primeiro: TOPLINKESSENTIALS:
http://www.oracle.com/technology/products/ias/toplink/jpa/download.html

Depois tente baixar o MYSQL pois foi esse que eu utilizei para a persistencia, mas tudo bem.

Após isso crie um banco de dados com o nome TESTE e uma tabela USUARIO com os seguintes campos:

id int(10)(unsigned, not null, autoincrement e primary key)
nome varchar(50)(not null)
sobrenome varchar(50)(notnull)
idade int(3)(notnull)

Após criado o banco de dados estamos prontos para criar nossa unidade de persistencia e nosso código.
O código apresentado asseguir é o mesmo postado por TECNOAGE porém com algumas modificações.
Primeiramente importe os jars do toplink para o seu classpath ou para sua pasta de Libraries se vc estiver utilizando o netbeans como eu. Importe tbm o driver do MYSQL.

NO MEU CASO FORAM:
toplink-essentials.jar
mysql-connector-java.5.0.4-bin.jar

Vamos ao código:

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;


@Entity
@Table(name = "Usuario")
@NamedQueries( {
    @NamedQuery(name = "Usuario.findById", query = "SELECT u FROM Usuario u WHERE u.id = :id"),
    @NamedQuery(name = "Usuario.findByNome", query = "SELECT u FROM Usuario u WHERE u.nome = :nome"),
    @NamedQuery(name = "Usuario.findBySobrenome", query = "SELECT u FROM Usuario u WHERE u.sobrenome = :sobrenome"),
    @NamedQuery(name = "Usuario.findByIdade", query = "SELECT u FROM Usuario u WHERE u.idade = :idade")
})
public class Usuario implements Serializable {
    
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private int id;
    
    @Column(name = "nome", nullable = false)
    private String nome;
    
    @Column(name = "sobrenome", nullable = false)
    private String sobrenome;
    
    @Column(name = "idade", nullable = false)
    private int idade;
    
    public int getId() {
        return this.id;
    }
    public void setNome(String name) {
        this.nome = name;
    }
    public String getNome() {
        return this.nome;
    }
    public void setSobreNome(String surName) {
        this.sobrenome = surName;
    }
    public String getSobreNome() {
        return this.sobrenome;
    }
    public void setIdade(int age) {
        this.idade = age;
    }
    public int getIdade() {
        return this.idade;
    }
    
}

Eu coloquei o:
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@GeneratedValue(strategy = GenerationType.IDENTITY)

Pois gera valores do tipo auto_increment para chaves primárias do tipo "IDENTITY" ou seja é mais facil para retirarmos o valor por um get, caso não colocarmos essa opção ele só implementará o auto_increment no banco de dados e não no programa e isso não é muito bom pois pode acarretar erros.
Se vc estiver utilizando o netbeans ao criar o campo @Entity ele vai pedir para vc criar uma PERSISTENCE UNIT, automático, bem então vamos a criação dela, ele pedirá o banco utilizado, onde se localiza seu driver e tudo mais, caso vc fez a importação correta dos jars para o classpath e para ou para a pasta libraries ele irá encontrar o toplink-essentials automáticamente, mas caso não, não tem problema.
Caso vc não esteja utilizando netbeans, crie um pacote chamado META-INF e crie um .xml chamado persistence dentro do pacote e insira o código abaixo:


&lt?xml version="1.0" encoding="UTF-8"?&gt
<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="TesteJPAPU" transaction-type="RESOURCE_LOCAL">
        <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
        
        <class> br.com.usuario.Usuario </class>
        
        <properties>
            <property name="toplink.jdbc.url" value="jdbc:mysql://localhost/teste"/>
            <property name="toplink.jdbc.user" value="root"/>
            <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="toplink.jdbc.password" value=" "/>
            <property name="toplink.ddl-generation" value="create-tables"/>
        </properties>
    </persistence-unit>
</persistence>

Lembrando que user: é seu usuário do mysql e password sua senha, caso seja diferente altere se não a conexão não será precisa.
Esta linha deve ser alterada: <class> br.com.usuario.Usuario </class> para o pacote ou localização da classe que criamos anteriormente (USUARIO).

Após criado nosso persistence unit podemos criar uma classe para nossa persistencia:

import javax.swing.JOptionPane;
import javax.persistence.*;

public class TestePersistencia {
    public static void main(String[] args) {
        String jNome;
        String jSobreNome;
        int jIdade;
        
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TesteJPAPU");
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        
        Usuario usr = new Usuario();
        jNome = JOptionPane.showInputDialog("Insira o Nome do Usuário:");
        usr.setNome(jNome);
        jSobreNome = JOptionPane.showInputDialog("Insira o Sobrenome do Usuário:");
        usr.setSobreNome(jSobreNome);
        jIdade = Integer.parseInt(JOptionPane.showInputDialog("Insira sua idade:"));
        usr.setIdade(jIdade);
        
        em.persist(usr);
        em.getTransaction().commit();
        em.close();
        emf.close();
        JOptionPane.showMessageDialog(null,"ID: "+usr.getId()+"\nNome: "+usr.getNome()+
                "\nSobrenome: "+usr.getSobreNome()+"\nIdade: "+usr.getIdade(),
                "Usuário Persistido",JOptionPane.INFORMATION_MESSAGE);
    }
    
}

A classe acima realiza a persistencia de dados para o banco de dados utilizando o EntityManager e a PersistenceUnit e nossa classe Usuario, que irá fazer o mapeamento de dados e fará com que nossos atributos sejam instanciados no banco de dados.
Bem eu utilizei um componente Swing para dar a entrada de dados, mas vc pode fazer do modo que vc quiser. É um bom começo para criação de JPA’S. Bem eu estou iniciando como disse e não posso comentar muita coisa por enquanto, sei que é muito melhor que JDBC.
Se eu aprender mais algo relacionado prometo postar outros exemplos… é um assunto muito atual e vale a pena comentar… Até mais.

Só um detalhe: você não vai implementar JPA, você vai utilizar alguma implementação da JPA…

Bom entao vamos la.
Dei + uma olhada por ai achei uns tutos e tal dai olha só o q saiu.

package br.com.jeebrasil.dominio;
import javax.persistence.*;

@Entity
@Table (name="aluno")
public class Aluno {

	@Id @GeneratedValue
	private int id;
	private int matricula;
	private String nome;

	
	public void setId(int id) {
		this.id = id; 
	}

	public void setMatricula(int matricula) {
		this.matricula = matricula; 
	}

	public void setNome(String nome) {
		this.nome = nome; 
	}

	public int getId() {
		return (this.id); 
	}

	public int getMatricula() {
		return (this.matricula); 
	}

	public String getNome() {
		return (this.nome); 
	}
}
package br.com.jeebrasil.dominio;
import javax.persistence.*;

public class Princip {
	
	public void teste(){

		//Cria objeto que gerenciará persistência
		EntityManagerFactory fabrica = 
			Persistence.createEntityManagerFactory("exemplo");
			
		EntityManager gerenciador = fabrica.createEntityManager();
		
		try {
			EntityTransaction tex = gerenciador.getTransaction();
			tex.begin(); //Inicia transação
			
			Aluno a1 = new Aluno();
			a1.setNome("Pedro");
			a1.setMatricula(20009387);
			gerenciador.persist(a1); //Persiste primeiro aluno
			
			Aluno a2 = new Aluno();
			a2.setNome("Maria Eduarda");
			a2.setMatricula(20052347);
			gerenciador.persist(a2); //Persiste segundo aluno
			
			tex.commit(); //Finaliza transação
			System.out.println("teste.Final");
		} catch (Exception ex) {
			System.out.println("teste.Ex");
			//tex.rollback(); //Desfaz operações em caso de erro
		} finally {
			//Libera recursos
			gerenciador.close();
			fabrica.close();
			System.out.println("teste.Finally");
		}
	}
}
<?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"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
 	http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">

	<persistence-unit name="exemplo" transaction-type="RESOURCE_LOCAL">
	
		<class>br.com.jeebrasil.dominio.Aluno</class>
		
		<properties>
			<property name="hibernate.connection.driver_class"
				value="org.postgresql.Driver"/>
			<property name="hibernate.connection.username" 
				value=""/>
			<property name="hibernate.connection.password"
				value=""/>
			<property name="hibernate.connection.url"
				value="jdbc:postgresql://localhost/testeJpa?charSet=LATIN1"/>
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.PGSQLDialect"/>
		</properties>
	</persistence-unit>
</persistence>

E chamo de um sevlet assim, acredito que esta nao seja a maneira + correta (chamar direto de um servlet) + vamos la.

package servlets.teste;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import org.apache.commons.beanutils.RowSetDynaClass;

public class ServTeste extends HttpServlet {
	int operacao;
	String msgErro;
	
	public void doPost(HttpServletRequest request,HttpServletResponse response)
	throws IOException, ServletException{
		doGet(request,response);
	}
	public void doGet(HttpServletRequest request,HttpServletResponse response)
	throws IOException, ServletException{

		
		// Recebendo dados
		if(request.getParameter("operacao")!=null && !request.getParameter("operacao").equals("")){
			operacao = Integer.parseInt(request.getParameter("operacao"));
		}
		
		if (operacao == 1){
			br.com.jeebrasil.dominio.Princip princip = 
				new br.com.jeebrasil.dominio.Princip();
				
			princip.teste();
				
			System.out.println("passou");
		}
	} //DoGet
}	// Class

Mas olha so o erro.

java.lang.NoClassDefFoundError: org/hibernate/MappingException
	org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:119)
	javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
	javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
	br.com.jeebrasil.dominio.Princip.teste(Princip.java:9)
	servlets.teste.ServTeste.doGet(ServTeste.java:30)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Como puderam perceber utilizo um db em PGSQL com o user default sem senha.
Coloquei o persistence.xml dentro de WEB-INF/META-INF/pesistence.xml
A simmm, e tb coloqi os seguintes arqs na lib da minha app.
toplink-essentials-agent.jar
toplink-essentials.jar
hibernate-annotatioons.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar

Er…você não está misturando as coisas não? Você ta tentando usar toplik E hibernate?

Entao mas seu usar so o toplink tenho q mudar o persistence.xml ne
nao tenho um modelo dele aki.