Configurando JPA [comofas/]

Oi Galera!

Gostaria de começar a utilizar o JPA em meus novos projetos mas não sei quase nada sobre o assunto.

Criei um projeto em que vou utilizar o Spring Framwork 3 e gostaria de adicionar e configurar JPA a ele.

Com o maven, adicionei como dependencia o Hibernate 3.4.0 GA.

Gostaria de saber como configuro minha aplicação para utilizar JPA.

Inicialmente vou rodar no tomcat mas pretendo rodar em um application server posteriormente.

Grato

É só vc criar seus beans e criar um persistence unit, dentro de se eu não me engano, WEB-INF

esse arquivo se chama persistence.xml

dentro dele vai as configurações do provedor de dados

Ai é só vc criar um EntityManagerFactory

Aqui tem uma configuração parecida com a que eu uso

Essa configuração é do 2.5, eu tbm uso esse, mais deve ser a mesma coisa para o 3.0

Para usar dpois

é só anotar suas classes com @Repository

criar um set para um EntityManager e anotar esse método com @PersistenceContext

Os métodos para salvar, atualizar…

devem ser anotados com @Transacional

Bom, é assim que eu faço

Explicar tudo passo a passo aqui no fórum é bem complicado.
O ideal é pegar algum livro ou então algum artigo na internet.

O site do Hibernate (que também é um JPA Provider) tem uma documentação muito boa.

Bons estudos

No caso de eu estar utilizando Spring: Eu preciso configurar o persistence.xml?

O meu esta configurado dessa maneira e não funciona.

<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="hibernate" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:/DefaultDS</jta-data-source>
		
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
			<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
		</properties>
	</persistence-unit>
</persistence>
@Controller
public class JSPRequestHandler {
	@RequestMapping("/index.java")
	public String index() {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernate");
		EntityManager em = emf.createEntityManager();
		MyEntity myEntity = new MyEntity();
		em.persist(myEntity);
		return "index.jsp";
	}
}

Qto ao Spring e ao persistence.xml acho que precisa, nunca testei sem

QUe erro dá?

No seu persistence Unit, vc indicou que vai usar transação e no código vc não usou para dar o persist

zoren, você pode me enviar o seu persistence.xml?

Estou tendo o seguinte erro

[color=red]javax.naming.NameNotFoundException: Name DefaultDS is not bound in this Context[/color].

segue minha configuração

spring-config.xml

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
	<bean
		id="hibernate"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="Access" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
		</property>
		
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>

			</props>
		</property>
	</bean>
	
	<bean name="Access" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="sun.jdbc.odbc.JdbcOdbcDriver" />
		<property name="url" value="jdbc.odbc.Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=tasks.mdb" />
	</bean>
</beans>

persistence.xml

<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="hibernate" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		
		<class>br.mikhas.echecklist.web.MyEntity</class>
		
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
			<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />  
		</properties>
	</persistence-unit>
</persistence>

Sim… estou usando access para testar :frowning:

O problema é a declaração do JTA no seu xml

eu uso assim

<?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="database">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <properties>
      	 <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
         <property name="hibernate.show_sql" value="false"/>
         <property name="hibernate.format_sql" value="false"/>
      </properties>
   </persistence-unit>
</persistence>

Alterei o transaction-type para JTA mas o erro continua.

O que é o DefaultDS?

DefaultDS é a configuração do JTA no seu container

COloca ai o su persistence.xml

Hmm… no meu caso, estou usando o Tomcat. Ele não é um servidor de aplicação, apenas servlet container.

Acabei de ler que quando não estou usando um Aplication Server, devo utilizar o transaction type como “RESOURCE_LOCAL”.

Alterando meu transaction-type para RESOURCE_LOCAL… continuo tendo o erro.

Como eu crio ou configuro esse DefaultDS (que suponho eu que significa “Default Data Source”).

<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="hibernate" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		
		<class>br.mikhas.echecklist.web.MyEntity</class>
		
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
			<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />  
		</properties>
	</persistence-unit>
</persistence>

Onde cria eu não faço a menor idéia

embaixo da declaração do provider, coloca

Uma pergunta,

Eu configurei o JPA, mas ainda me resta uma dúvida quando a estrutura do projeto. Coloquei o arquivo persistence.xml no META-INF existente dentro do diretório WebContent mas o EntityManagerFactory parece não encontrar o arquivo, então criei um diretório META-INF dentro da raiz do src e ai ele fucnionou normalmente.

É correto isso ou falta alguma coisa?

Abraços

[quote=peppe]Uma pergunta,

Eu configurei o JPA, mas ainda me resta uma dúvida quando a estrutura do projeto. Coloquei o arquivo persistence.xml no META-INF existente dentro do diretório WebContent mas o EntityManagerFactory parece não encontrar o arquivo, então criei um diretório META-INF dentro da raiz do src e ai ele fucnionou normalmente.

É correto isso ou falta alguma coisa?

Abraços[/quote]

Não sei te dizer, pois uso NetBeans, comigo ele sempre cria dentro do diretório da web

Acredito que esteja correto sim, estava lendo o livro “Dominando Java Server Faces e Facelets Utilizando Spring 2.5 Hibernate e JPA” da Editora Ciência Moderna e na parte de configuração do JPA com Hibernate ele apresenta a criação de um diretório META-INF na raiz do src…

Acredito que esteja, mas se alguém possuir alguma outra diga de como fazer, agradeço!

peppe tem um pequeno lance que descobrir essa semana no eclipse, qdo eu crio um folder dentro de src META-INF por exemplo e coloco meu persistence la, e tento rodar minha app, simplesmente nao funciona… Ai eu fui deletei a pasta e criei o diretorio fora do eclipse e depois dei um refresh e dai passou a reconhecer meu arquivo de persistencia. meio que estranho mas funcionou.

Outra solucao eh instalar o jboss tool eh uma ferramenta excelente para JSF, Struts, JPA. tem a opcao de criar um projeto JPA com toda configuracao ja pronta. No post abaixo tem como instalar e configurar a ferramenta no eclipse.
http://blog.camilolopes.com.br/?p=1177

abracos