Top Posts

Quanto invisto em T.I?

Continue lendo

JPA com Hibernate + JSF + MySQL

Posted by camilolopes | Posted in BD, Hibernate, JSF | Posted on 23-08-2010

28

olá Pessoal,

Neste post, vou mostrar como usar JPA para seus projetos JEE tendo como provider o nosso Hibernate e para o view usaremos JSF. Alguns adoram o TopLink da Oracle, eu tive serios problemas com ele na parte de config, e cansei de me stressar com coisas operacionais e mantenho meu querido Hibernate como provider.

Aplicação será bem simples, apenas cadastrar um cliente. Limitamos os dados do form, pois o objetivo é mostrar como criar um ambiente para development tendo JPA nos seus projetos. Já mostrei em outros posts, como criar um projeto JPA para Java Básico. Então, recebi alguns emails e para JEE?

Lets go…

Oportunidade Java:

Posts relacionados

Requisitos

Iniciando

Na imagem a seguir você tem toda a estrutura do projeto, observe que já criei as bibliotecas para o projeto e estas foram adicionadas. Se não quiser adicioanr as bibliotecas ao projeto, copie os .jars para a pasta lib e pronto. Lembre-se que ao adicionar uma biblioteca ao projeto, o stupid Eclipse não copia os .jars para a pasta lib. (ao contrário do netbeans :) ).

Não esqueça também de criar um schema e uma table no MySQL, aqui chamaremos de sistemas e clientes respectivamente.

estrutura

1.monte uma estrutura conforme a imagem acima.

Para os arquivos em .jsp e .xml tive que colocar no formato imagem. Infelizmente o plugin para code no wordpress, esse é estressante quando envolve xml, html etc. preciso ficar dando um espaco para cada par de < > senão ele bagunça todo código ou até converte para qualquer outra coisa. Já gastei 1 hora somente para tentar configurar isso. Em função disso, coloquei no formato img o code bem organizado. O lado bom, é que você poderá praticar sem dar ctrl + c e ctrl + v. :)

E como sempre boa parte das explanações estão dentro do code no formato de comentário, lado-lado para facilar a compreensão.

Desenvolvimento

2.primeiro passo é criar o bean e fazer as devidas anotações, então veja abaixo o nosso cliente bean como está:

Agora vamos partir para criar o nosso DAO, que nele teremos a nossa fábrica de conexão. E poderiamos ter métodos genéricos como salvar, deletar, atualizar etc.Mas, não vamos implementar todos.

Agora vamos criar a classe que vai fazer a persistencia com os dados do cliente. É a ClienteDAO.java esta classe extends a classe DAO, para conseguirmos pegar um objeto objeto EntityManager que é responsável pelas inclusões, exclusões e atualizações.

Agora criaremos a classe ClienteController quer terá a responsabilidade de direcionar a comunicação do JSF e pegar o foi digitado no form e persistir.

Vamos configurar o no velho e querido face-config.xml

faceconfigdesign

Criando arquivo persistence.xml

o arquivo que vamos precisar para conectar ao banco de dados, parecido como hibernate.cfg.xml, em respeito de ter a mesma função, conectar ao BD.

Observe o name da persistence-unit pois, eh ele que usamos no nosso DAO.java

persistence

Não esqueça que terá que criar um folder META-INF em JavaSource e colocar o persistence.xml neste folder e não coloca-lo dentro do META-INF de WebContent. Alguns programadores acabam confundido e dai recebe as velhas exceções e ficam stressado. Take care easy!

Criando as pages JSF

1.Agora criamos três páginas .jsp com JSF, uma será index que redireciona para cadastro.jsf e a outra é somente uma mensagem dizendo que foi cadastrado com sucesso.

Index.jsp

Coloque o código abaixo na página index.jsp

cadastrojsf

Testando

Mande executar seu projeto. Clique nele e vá em Run ==> Run as ==> Run on Server

  • Cadastre um cliente

E depois verifique se ele está realmente no BD. Veja abaixo meus prints:

testecad

testesucessocad

testemysqlcad

Pessoal, vou ficando por aqui, espero que tenham gostado do post, o objetivo era dar o “ABC Prático” de JPA com JEE usando o framework JSF.

Abracos, see you later.! :)

Related Posts with Thumbnails

Comments (28)

Lembro-me que você me deu um incentivo enorme quando eu estava estudando JAVA. Hoje sou desenvolvedor, e isso já faz quase dois anos.

Como sempre, respostas esclarecedoras para caminhos sinuosos.
Sucesso!

By the way, ótimo artigo!

opa! odair.
bom saber que ta na aerea e que meu incentivo ti ajudou.

abracos,

Tô muito interessado em aprender Hibernate. Até hoje só utilizei JPA. Vendo essda aplicação, não parece ser tão difícil.

Camilo, vc poderia postar o download novamente dos jars do Hibernate? Baixei 2 vezes e quando tento abrir a pasta aparece como inválida e corrompida. Baixei tbm o arquivo do JSF e tbm tá com o mesmo problema.

É isso aí cara, valeu!

olá anderson,

que estranho, deletei os arquivos e subir novamente, dar uma olhada ai se está ok, aqui ta normal, nao ta corrompido nao.
Um detalhe que reparei antes é que com o winzip dar merda, porem com o winrar nao.
abracos,

Agora sim está tudo certo. Baixei os 2 arquivos e consegui extrair os jars.

Obrigado Camilo!

Camilo, pra rodar esse exemplo no jBoss ou glassfish tem alguma coisa que eu preciso acrescentar?

Estou com o projeto rodando normal no GlassFish

Porem quando eu chamo o servlet que executa um cadastro no banco da o seguinte erro

javax.persistence.PersistenceException: No Persistence provider for EntityManager named cadastro

no caso o meu persistence-unit chama cadastro

Estou a 2 dias tentando rodar um JPA no JBoss e nao consigo, agora passei pro netbeans+glassfish e esta dando o mesmo problema

To ficando loco já iuahiuah

Se puder ajudar ficarei grato

Valeww

opa, bruno
pela leitura do erro, é questao de configuracao do persistence, eu tb ja apanhei com isso no tomcat, mas eu nunca usei os servidores mencionados por vc para testar o exemplo acima. dar uma olhada na documentacao se nao tem algo.
flw. abracos,

Gostaria de saber se não tem nenhuma anotação no ClienteConntroller, tais como, @ManagedBean e o seu scope

Camilo,
ao executar na minha maquina, seguindo o seu tuto deu o seguinte erro:
/index.xhtml @16,150 value=”#{loginController.login.nome}”: Target Unreachable, identifier ‘loginController’ resolved to null.

Será que vc poderia me ajudar?
Obrigado!

Desculpe-me! estou utilizando o netbeans

CamiloLopes muito obrigado pelo post. Ele foi de grande ajuda.
Consegui resolver meu problema, pois o erro estava no local onde é colocado o arquivo de configuração (persistence.xml). No seu tutorial ele é colocado na pasta META-INF, porém acho que isso só vale pro eclipse, pois no netbeans é colocado direto no projeto e o netbeans encaminha para o local correto. Fica ai a dica..

olá, sei que o tutorial é antigo mas se alguem puder me ajudar, nem consigo testar a pagina pois meu jboss 5 não carrega, dá a seguinte mensagem:

Error installing to Start: name=persistence.unit:unitName=#sistemas state=Create
java.lang.RuntimeException: Specification violation [EJB3 JPA 6.2.1.2] – You have not defined a non-jta-data-source for a RESOURCE_LOCAL enabled persistence context named: sistemas

ele nao encontrou o context sistemas, veja as configs do context se estão ok.

Na parte Criando as pages JSF, você fala de 3 páginas, mas só vi uma, como ele redireciona do indes.jsp para cadastro.jsf??? O que tem na index e na cadsrto e a outro, qual é?

opa! emir, obrigado pelo feedback, acabei escrevendo errado, na verdade no inicio eu tinha pensando em tres, mas depois reduzir e nao mudei no texto. Observe que são apenas duas paginas, a index.jsp é que tem o formulario e a segunda, é da mensagem que nao precisa ser apresentada, pq é uma pagina jsp qualquer com uma mensagem de sucesso. E pela image do face-config.xml temos as duas paginas conversando.
abracos,

Camilo sei que o post é antigo mas resolveu o meu problema a única dúvida é porque existe a necessidade de instanciar um Objeto, na classe DAO, EntityManager e passar para ele o getEntityManager da super classe ao invés de se usar diretamente o getEntityManager da super classe !?

Obrigado Abraço

olá Fernando,
Instanciamos o DAO na classe DAO? olhando o post, a há uma instancia no controller para o xxxDAO. Não entendi muito bem a pergunta.

flw.

@camilolopes
Oi Camilo vou exemplificar com código! Porque fazer isso:

public void salvar(Cliente cliente){

EntityManager em = getEntityManager();
try{

em.getTransaction().begin();

em.persist(cliente);

em.getTransaction().commit();
}catch (Exception e) {

em.getTransaction().rollback();
}

Em vez Disso:

public void salvar(Cliente cliente){

try{

getEntityManager().getTransaction().begin();

getEntityManager().persist(cliente);

getEntityManager().getTransaction().commit();
}catch (Exception e) {

getEntityManager().getTransaction().rollback();
}

Era assim que estava a minha implementação e não dava certo de jeito nenhum depois que olhando no seu exemplo você instancia um EntityManager em e passa como valor o getEntityManager() da super . é essa a minha dúvida porque não funciona diretamente!

Abraços

Fernando,
fernando realmente não vai funcionar, para cada getEntityManager() que tu chama, tu tem um objeto novo concorda? então no teu catch e outras invocações tu nao tem o mesmo objeto diretamente, estamos lidando com variaveis de instância e não static, percebeu o pulo do gato? e pq temos que ter o objeto antes ?
abracos,

Entendi sim Camilo!!! ta na minha kra e eu não imaginei isso! Obrigado pela reposta! um abraço e sucesso pra ti!

Bom dia Camilo,

Estou com um problema quanto tento subir a aplicação do jboss no servidor, infelizmente, esta com esse erro de persistence que eu não consigo resolver. Será que tem como você me ajudar, desde já muito obrigado.

08:23:58,389 INFO [CollectionBinder] Mapping collection: br.unicamp.sigm.cad_unico.jpa.Pfj.blocoNotasSet -> BLOCO_NOTAS
08:23:58,389 INFO [CollectionBinder] Mapping collection: br.unicamp.sigm.cad_unico.jpa.Pfj.caixasPostaisSet -> CAIXAS_POSTAIS
08:23:58,390 ERROR [AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=sigm_main.ear/sigm_ejb3_almoxarifado.jar#sigm_ejb3_almoxarifadoPU state=Create
org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: br.unicamp.sigm.cad_unico.jpa.Pfj.consorciosSet[br.unicamp.sigm.cad_unico.jpa.Consorcios]
at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1071)
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:602)
at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:543)
at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1163)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:329)
at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1148)
at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1226)
at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:173)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:854)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:425)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:131)
at org.jboss.jpa.deployment.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:301)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.reflect.plugins.introspection.ReflectionUtils.invoke(ReflectionUtils.java:59)
at org.jboss.reflect.plugins.introspection.ReflectMethodInfoImpl.invoke(ReflectMethodInfoImpl.java:150)
at org.jboss.joinpoint.plugins.BasicMethodJoinPoint.dispatch(BasicMethodJoinPoint.java:66)
at org.jboss.kernel.plugins.dependency.KernelControllerContextAction$JoinpointDispatchWrapper.execute(KernelControllerContextAction.java:241)
at org.jboss.kernel.plugins.dependency.ExecutionWrapper.execute(ExecutionWrapper.java:47)
at org.jboss.kernel.plugins.dependency.KernelControllerContextAction.dispatchExecutionWrapper(KernelControllerContextAction.java:109)
at org.jboss.kernel.plugins.dependency.KernelControllerContextAction.dispatchJoinPoint(KernelControllerContextAction.java:70)
at org.jboss.kernel.plugins.dependency.LifecycleAction.installActionInternal(LifecycleAction.java:221)
at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:54)
at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:42)
at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:774)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:540)
at org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataDeployer.deploy(BeanMetaDataDeployer.java:121)
at org.jboss.deployers.vfs.deployer.kernel.BeanMetaDataDeployer.deploy(BeanMetaDataDeployer.java:51)
at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70)
at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53)
at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:361)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
at org.jboss.system.server.profileservice.repository.AbstractProfileService.activateProfile(AbstractProfileService.java:306)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:271)
at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461)
at org.jboss.Main.boot(Main.java:221)
at org.jboss.Main$1.run(Main.java:556)
at java.lang.Thread.run(Thread.java:662)
08:23:58,550 INFO [PersistenceUnitDeployment] Starting persistence unit persistence.unit:unitName=sigm_main.ear/sigm_ejb3_cad_unico.jar#sigm_ejb3_cad_unicoPU
08:24:01,313 INFO [SessionSpecContainer] Starting jboss.j2ee:ear=sigm_main.ear,jar=sigm_ejb3_cad_unico.jar,name=EnderecosServiceBean,service=EJB3
08:24:01,319 INFO [EJBContainer] STARTED EJB: br.unicamp.sigm.cad_unico.bo.EnderecosServiceBean ejbName: EnderecosServiceBean
08:24:01,330 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

Anderson,

Lendo as mensagens de erros que são sempre objetivas. Vi que vc está com problema no seu mapeamento. Sugiro vc revisar os mapeamentos da sua classe, principalmente o @oneToMany e @ManyToMany.

flw.

ok Camilo irei verificar,

Muito obrigado pela sua atenção.

Vc nao usa o arquivo web.xml?? E o faces-config?? Por que nao usa eles??
Outra coisa. Tá dando o seguinte erro ao eexecutar:

type Status report

message /JPAWebBlog/

description The requested resource (/JPAWebBlog/) is not available.

——————————————————————————–

Apache Tomcat/7.0.27

Roger,

Acho que vc não viu o post direito. Há o face-config.xml. E o web.xml nada foi alterado. Não motivo para colocá-lo. Sem falar que o post já considera que o leitor conhece o básico de JSF. Se seguir os passos corretos e ter uma noção básica como uma aplicação JEE com JSF funciona vai ver que tu vai rodar corretamente.

abracos,

Boa tarde Camilo,
Estou com um erro ao persistir no banco… conferindo trace do jboss ele me retorna o erro:
“javax.servlet.ServletException: javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Could not open connection”
“15:38:57,732 ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] (http-localhost-127.0.0.1-8080-1) HHH000319: Could not get database metadata: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/automoveis”
o erro e o mesmo tanto n seu tutorial como em uma outra aplicaçao que estou fazendo.
ja usei varias versões de lib do mysql e msm assim o problema persiste.
vc tem alguma ideia do que poderia fazer?

Olá Francisco,
Seu banco ta rodando mesmo?O driver de conexão não tem erro, é esse http://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.26.
Veja se o .jar está no lib da sua app quando deployed.
flw.

Camilo, excelente tutorial! Eu só fiquei travado na configuração do faces-config
Será que você pode me enviar o código fonte do seu faces-config.xml?

Write a comment