JPA : Como gerenciar o EntityManagerFactor e EntityManager?
9 respostas
Valter_Henrique
Oi pessoal, tudo bem ?
Eu estou começando um projeto em JSF, preciso adicionar o acesso ao banco de dados ao projeto, gostaria de fazê-lo com o JPA.
Depois de ler bastante sobre, vi a diferença entre as transações ‘Resource Local’ e ‘JTA’.
Tentei várias vezes configurar o acesso via JTA, mas não consegui, então vou usar o ‘Resource Local’ mesmo com o EclipseLink 2.3.
Agora preciso criar uma forma adequada de criar os DAO’s porém estou preocupado com o EntityManagerFactory, já que ele é um recurso muito custoso.
Então gostaria de saber como vocês gerenciam o EntityManagerFactory e o EntityManager.
Estou pensando em fazer os DAO’s herdarem de uma classe ‘DAO’ os métodos de abrir/ criar o EntityManager, mas isso será o suficiente ?
Quando devo fechar o EntityManager e EntityManagerFactory ?
Crie suas classe de dao como interface e faça a implementação dos metodos em outra classe exp: DaoImpl.
rmendes08
Eu não acho uma boa idéia acoplar a obtenção do EntityManager no DAO. Se você criar testes de integração para os seus DAOs vai entender porque complica. Eu acho mais interessante que o DAO receba o EntityManager através de um settter, pois se você tiver que criar o EntityManager dentro do DAO, você também vai ter que controlar transações dentro dele, o que é um acoplamento bastante forte. Eu não conheço o ciclo de vida do JSF, mas eu criaria o EntityManagerFactory no startup da aplicação e colocaria em algum cache. Depois, para cada requisição, recupero a factory, crio um EntityManager, abro a transação, processa a regra de negócio, e por fim, commit ou rollback, dependendo do sucesso ou falha do processamento. Não é performático, mas é a maneira mais simples que eu vislumbro. Acho que qualquer coisa mais complicada vale a pena usar um JBoss ou Spring da vida e usar as facilidades do container.
Tópico não é muito recente, mas estou iniciando um projeto financeiro, não é tão grande (mas intensão é ser futuramente), quero inicialmente hospedar na web, mas estou em dúvida em que tecnologia utilizar para implementar a camada de persistencia.
Utilizar a implementação do JPA, com os EntityManager e EntityManagerFactory e como fazer o gerenciamento dos mesmo (Open session in view, ou outra implementação, um JpaUtil), ou utilizar apenas hibernate sem implementação do JPA, com as sessions, um HibernateUtil.
Valeu.
bobboyms
Exemplo de uso especificação JPA independente de implementação com o uso do componente
packagebr.teste.pacote;importjavax.persistence.EntityManager;importjavax.persistence.EntityManagerFactory;importjavax.persistence.Persistence;importjavax.persistence.Query;importbr.com.jpa.component.ConfigPersistence;importbr.com.jpa.component.Configuration;publicclassTestJPA{publicstaticvoidmain(String[]args){Configurationconfiguration=ConfigPersistence.getInstanceConfiguration();EntityManagerFactoryfactory=configuration.createEntityManagerFactory();EntityManagerem=factory.createEntityManager();Queryquery=em.createQuery("SELECT e FROM Cliente e ");List<Cliente>clientes=(List<Cliente>)query.getResultList();for(Clientecliente:clientes){System.out.println(cliente.getNome());}}}
FernandoFranzini
vinicius8891:
Bom dia pessoal,
Tópico não é muito recente, mas estou iniciando um projeto financeiro, não é tão grande (mas intensão é ser futuramente), quero inicialmente hospedar na web, mas estou em dúvida em que tecnologia utilizar para implementar a camada de persistencia.
Utilizar a implementação do JPA, com os EntityManager e EntityManagerFactory e como fazer o gerenciamento dos mesmo (Open session in view, ou outra implementação, um JpaUtil), ou utilizar apenas hibernate sem implementação do JPA, com as sessions, um HibernateUtil.
Valeu.
Coloque algum framework para fazer isso para vc - Web profile ou spring.
vinicius8891
Ok obrigado Pessoal!
E aproveitando o tópico, estou com o seguindo problema para rodar um exemplo simples de aplicação com spring, segue o log do erro, procurei no guj uma solução, mas ainda não consegui solucionar meu problema.
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/ExemploBasicoSpring] threw exception
java.io.FileNotFoundException: /content/categoria.xhtml Not Found in ExternalContext as a Resource
at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:224)
at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:265)
at com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:201)
at com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:114)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:227)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:111)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:508)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Obrigado desde já
vinicius8891
Segue os arquivos de config do spring:
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><!-- ********************************************* --><!-- Configuração do DataSource --><!-- ********************************************* --><beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><!-- Postgres configutarion --><propertyname="driverClass"value="com.mysql.jdbc.Driver"/><propertyname="jdbcUrl"value="jdbc:mysql://localhost:3306/db_agenda"/><propertyname="user"value="root"/><propertyname="password"value="123456"/></bean><!-- Configuraçãoes relativas a acesso a dados --><beanid="entityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><propertyname="dataSource"ref="dataSource"/><propertyname="jpaDialect"><beanclass="org.springframework.orm.jpa.vendor.HibernateJpaDialect"></bean></property><propertyname="jpaVendorAdapter"><beanclass="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><propertyname="showSql"value="true"/><propertyname="databasePlatform"value="org.hibernate.dialect.MySQL5InnoDBDialect"/></bean></property><propertyname="jpaProperties"><props><propkey="hibernate.format_sql">true</prop><propkey="hibernate.query.substitutions">true'S',false'N',yes'S',no'N'</prop><propkey="hibernate.query.jpaql_strict_compliance">true</prop><propkey="hibernate.hbm2ddl.auto">update</prop><!-- create | create-drop | validate | update --></props></property></bean><!-- Transaction Manager exclusivo para JPA --><beanid="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager"><propertyname="entityManagerFactory"ref="entityManagerFactory"/><propertyname="jpaDialect"><beanclass="org.springframework.orm.jpa.vendor.HibernateJpaDialect"></bean></property></bean></beans>
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><context:annotation-config/><context:component-scanbase-package="br.com.exemplospring"/><!-- habilita suporte as anotações transacionais --><tx:annotation-drivenorder="1"/><!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) --><tx:adviceid="txAdvice"><!-- the transactional semantics... --><tx:attributes><!-- all methods starting with 'get' are read-only --><tx:methodname="find*"read-only="true"/><tx:methodname="count*"read-only="true"/><tx:methodname="get*"read-only="true"/><tx:methodname="busca*"read-only="true"/><tx:methodname="lista*"read-only="true"/><tx:methodname="carrega*"read-only="true"/><!-- other methods use the default transaction settings (see below) --><tx:methodname="*"propagation="REQUIRED"/></tx:attributes></tx:advice><!-- Configuração do Aspecto das transações. --><aop:config><aop:pointcutid="serviceMethods"expression="execution(* br.com.exemplospring.service..*.*(..))"/><aop:advisororder="2"advice-ref="txAdvice"pointcut-ref="serviceMethods"/></aop:config></beans>