Configuração Jndi + Glassfish + Spring + Hibernate + Jpa (puts)

13 respostas
F

Estou tentando configurar o glassfisfh 3 hibernete 3 spring 3 e jpa

Alguém sabe onde o vacilando. Obrigado pela força.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

     <!--
    <bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"  >
            <property name="persistenceUnitName"  value="TotalsatCommonTestPU" />
    </bean>

    <bean  class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />


    <bean  id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
     <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
     -->

     <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName">
            <!--value>java:jndi_postgres_adm</value-->
            <value>jdbc/_financeiro</value>
        </property>
    </bean>



    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="persistenceUnitName" value="TotalsatCommonTestPU"   />
    </bean>

     <bean  class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

      <bean  id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
     <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>



    <bean id="teste"  class="com.br.totalsat.common.Teste" />

</beans>




<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
    <persistence-unit name="TotalsatCommonTestPU" transaction-type="JTA">
        <jta-data-source>jdbc/_financeiro</jta-data-source>
  
    <properties />
    </persistence-unit>
</persistence>

  @PersistenceContext(name="persitenceFinaceiro")
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    
    <persistence-context-ref>
        <persistence-context-ref-name>persitenceFinaceiro</persistence-context-ref-name>
        <persistence-unit-name>TotalsatCommonTestPU</persistence-unit-name>
    </persistence-context-ref>

            
</web-app>

13 Respostas

D

Se vc quer implementar via JPA, pq q vc não acessa direto via o DataSource definido no ‘persistence.xml’??!

Ah ninja, deixa eu adivinhar, vc não está usando netBeans, né?!! :shock:

F

To usando sim, não por preferencia e sim por normas da empresa.
Você tem um exemplo para me passar ?

D

Flavio,
(P/ 1 exemplo, 1º me fala a versão do seu netBeans.)

Bem, aparentemente vc não teve ainda 1 insight de p/ q q servem e como funcionam o “.LocalEntityManagerFactoryBean” o “.LocalContainerEntityManagerFactoryBean”.
Se vc obteve suas Classes de Domain Model (Entidades de Negócio) via Engenharia Reversa usando a tool do netBeans, a partir de seu Banco de Dados, e, pelo q vc falou, usando o GlassFish, provavelmente (e se o seu Projeto Java é Web) ela gerou 1 Peristence Unit refenciando 1 DataSource definido no Container (Se vc estivesse usando o TomCat, vc teria q definir este DataSource “na unha” lá no Context.xml; mas isto já “era outros 500” :o)

(Uma dica: sempre q vc criar/definir 1 DataSource declare seguindo o seguinte padrão: nomebasededadosDS )

Muito bem, se o seu DataSource estiver funcionando bem, vc pode criar um EM com a conexão “configurada”/definida na Peristence Unit do ‘persistence.xml’, usando o LocalEntityManagerFactoryBean ± assim:

<!-- JPA LocalEntityManagerFactoryBean (Se "persistenceUnitName" não é definido e só há 1 PU no persistence.xml, ela(ou a 1ª PU) é usada. --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" > <property name="jpaVendorAdapter"> <!-- customização do JPA Provider (neste caso o Hibernate). --> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="true"/> <property name="generateDdl" value="false"/> <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /> </bean> </property > <property name="jpaProperties"> <props> <!-- Cria o Conections-Pooled DataSource usando a conexão definida na PersitenceUnit.--> <prop key="hibernate.c3p0.initialPoolSize">10</prop> <prop key="hibernate.c3p0.min_size">5</prop> <prop key="hibernate.c3p0.max_size">15</prop> <prop key="hibernate.c3p0.timeout">300</prop> <prop key="hibernate.c3p0.max_statements">50</prop> <prop key="hibernate.c3p0.idle_test_period">3000</prop> </props> </property> </bean>

Obs.: o ‘LocalContainerEntityManagerFactoryBean’ é outra opção q só deve ser usado caso vc deseja fazer o LookUp do DataSource via JNDI -> isto configurado diretamente no applicationContext do Spring.
(Se tiver + alguma dúvida, é só avisar! ;-)))

[Editado]P.S.: ah, caso queira configurar a transação via JTA e ver boas ideias em: http://springtips.blogspot.com/2008/06/spring-entitymanagerfactory-in-jta-and.html(Spring entityManagerFactory in jta and non-jta modes).

F

Cara valeu pela força, eu tive dando uma estudada e é oque meu chefe me pediu, para estabelecer uma conexão global e nao local pelo oque eu olhei na sua forma vc usa uma forma de conexão local, <bean id=“entityManagerFactory” class=“org.springframework.orm.jpa.LocalEntityManagerFactoryBean” > , ai eu vi umas configurações no pdf reference que vem junto do spring para fazer uma conexão global, então fiz o seguinte.

applicationContext.xml

&lt;jee:jndi-lookup id="dataSource" jndi-name="persitenceFinaceiro"/&gt;

&lt;bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" /&gt;

&lt;context:annotation-config /&gt;


&lt;bean id="dao"  class="com.br.totalsat.dao.Dao" /&gt;

// Porém quando coloco essa tag &lt;context:component-scan base-package="com.totalsat.control"&gt; ta exception, mas ela não seria obrigatória para eu injetar o dao ?

Meu percistence ta ´so assim 


&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;persistence version="2.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_2_0.xsd"&gt;
  &lt;persistence-unit name="TotalsatCommonTestPU" transaction-type="JTA"&gt;
    &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;
    &lt;jta-data-source&gt;jdbc/_financeiro&lt;/jta-data-source&gt;
  
    &lt;class&gt;com.br.totalsat.common.Teste&lt;/class&gt;
    &lt;properties/&gt;
  &lt;/persistence-unit&gt;
&lt;/persistence&gt;


Me dao ta assim


 private EntityManager entityManager;

    public void salvar(Object object) {

        entityManager.clear();
        entityManager.persist(object);
        entityManager.flush();

    }

    public EntityManager getEntityManager() {
        return entityManager;
    }

   
    @PersistenceContext(name="persitenceFinaceiro")
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }


O managed bean em que eu injeto o Dao ta assim

public class Test {


    @Resource
    private Dao dao;

    public void save(){



        Teste test = new Teste();

        test.setNome("Flávio");

        dao.salvar(test);

    }

    public Dao getDao() {
        return dao;
    }

    public void setDao(Dao dao) {
        this.dao = dao;
    }

    


}


Meu web.xml ta assim
  &lt;listener&gt;
        &lt;listener-class&gt;
            org.springframework.web.context.ContextLoaderListener
        &lt;/listener-class&gt;
    &lt;/listener&gt;

    
    &lt;persistence-context-ref&gt;
        &lt;persistence-context-ref-name&gt;persitenceFinaceiro&lt;/persistence-context-ref-name&gt;
        &lt;persistence-unit-name&gt;TotalsatCommonTestPU&lt;/persistence-unit-name&gt;
    &lt;/persistence-context-ref&gt;


Seguinte esas é uma aplicação de teste, quando funcionar agente vai trabalhar em cima.

Agora pelo menos quando eu faço o deploy na esta mais dando exception, o problema é que quando eu dou um save ele ta dando nullPointer

Abrigado pela força vou dar uma olhada no link quq vc me passou.

F

Vou revisar.

D

Flavio machine:
Cara valeu pela força, eu tive dando uma estudada e é oque meu chefe me pediu, para estabelecer uma conexão global e nao local pelo oque eu olhei na sua forma vc usa uma forma de conexão local, <bean id=“entityManagerFactory” class=“org.springframework.orm.jpa.LocalEntityManagerFactoryBean” > , ai eu vi umas configurações no pdf reference que vem junto do spring para fazer uma conexão global, então fiz o seguinte.
Flavio, o ‘LocalEntityManagerFactoryBean’ cria 1 EntityManagerFactory usando a conexão padrão de sua PU, sendo q esta conexão pode ser definida tanto por acesso direto como referenciando 1 DataSource (q. por sua vez, é 1 recurso global do seu container). No seu caso, não importa qual EntityManagerFactory vc use, se ela referencia a sua PU (<persistence-unit name=“TotalsatCommonTestPU” transaction-type=“JTA”> ) e essa PU já referencia 1 DataSource (<jta-data-source>jdbc/_financeiro</jta-data-source> ): isto, por si só, já significa q a Factory de EntityManager cria 1 EntityManager usando 1 recurso global (o DataSource de seu Container) e isso usando o Transacional JTA.
Mas, tudo bem! Se ainda quer obter o DataSource através de configuração explicita no Spring: sem problema. Obs.: apenas ouvi dizer q quando vc injeta o ‘dataSource’ no “.LocalContainerEntityManagerFactoryBean” e a sua aplicação se tornar larga escala “pode ser” q ela fique 1 pouco + lenta. Mas, funcionando, é o q importa (p/- no 1º momento). Entretanto, percebo algumas coisas q são potenciais problemas:

Flavio machine:

&lt;bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" /&gt;

Aki vc alterou o nome padrão (transactionManager) do “.JtaTransactionManager” para “txManager”. Se não o referenciou explicitamente no <tx:annotation-driven/> pode ser q haja algum problema na parte transacional. :shock:

Flavio machine:

&lt;context:annotation-config /&gt; &lt;bean id="dao" class="com.br.totalsat.dao.Dao" /&gt; // Porém quando coloco essa tag &lt;context:component-scan base-package="com.totalsat.control"&gt; ta exception, mas ela não seria obrigatória para eu injetar o dao ?

Veja bem, vc deve injetar os seus Repositorys (no seu caso, DAOs) nos respectivos DomainServices. Isto geralmente era/é feito de forma declarativa no applicationContext.xml assim: &lt;!-- O Spring é 1 Container FrameWork, portanto, se configurado via XML, todos os Objetos (instanciados) tem q ser definidos como &lt;bean . --&gt; &lt;bean id="usuarioRepo" class="domain.repository.UsuarioRepo" /&gt; &lt;bean id="usuarioServiceFcd" class="domain.srvcFacade.UsuarioServiceFcd"&gt; &lt;property name="usuarioRepo" ref="usuarioRepo" /&gt; &lt;/bean&gt; O annotation-config /> e “component-scan” devem ser usados quando, em vez de via XML, vc deseja fazer Injeção de Dependencias via Java Annotations. Por exemplo, assim:

&lt;context:annotation-config/&gt; &lt;context:component-scan base-package="domain.srvcFacade,domain.repository" use-default-filters="false"&gt; &lt;context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/&gt; &lt;context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/&gt; &lt;!--context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/--&gt; &lt;/context:component-scan&gt; Creio q vc deve ter se equivocado no 'base-package=“com.totalsat.control” '. No meu exemplo, inicialmente eu consegui fazer funcionar (como vc pode observar) configurando o base-package como “domain”(o qual é o pacote base dos SubPacotes ‘srvcFacade’ e ‘repository’). (Esse pacote ‘control’ se refere ao FrontController, ou a 1 tipo de “Gerenciador”, algo +/- como 1 DomainService??!)

Flavio machine:
Meu percistence ta ´so assim .. &lt;persistence-unit name="TotalsatCommonTestPU" transaction-type="JTA"&gt; ... Me dao ta assim .. @PersistenceContext(name=&quot;persitenceFinaceiro&quot;) public void setEntityManager(EntityManager entityManager) { ...
Vc declara sua PU como 'persistence-unit name=“TotalsatCommonTestPU” ’ e referencia como “persitenceFinaceiro”. Aconselho fortemente evitar essa ambiguidade, pq, mesmo q sua aplicação funcione, qq 1 q for ver o código não vai saber se ela usa a PU “TotalsatCommonTestPU” ou a PU “persitenceFinaceiro”. :shock:

Flavio machine:
.. public class Test { @Resource private Dao dao; ...Seguinte esas é uma aplicação de teste, quando funcionar agente vai trabalhar em cima.
Boa idéia. *2 Aliás, melhor ainda :idea:se vc encapsulasse o Domínio (Fluxo, Lógica e Regras de Negócio), Infra e Perisistência num Projeto JavaSE “Business-Core” (ou, de preferencia: Biblioteca de Classes) empacotado em um .JAR, q poderia servir várias Aplicações Cliente (apresentações), sendo importado por estas. Daí, vc poderia fazer JUnit Testes no topo dos DomainServices (neste testes, vc poderia testar a Persistencia e o recurso Transacional)
Flavio machine:

Agora pelo menos quando eu faço o deploy na esta mais dando exception, o problema é que quando eu dou um save ele ta dando nullPointer
Abrigado pela força vou dar uma olhada no link quq vc me passou.

O problema é que os casos de JUnit Testes não estão exatamente no mesmo contexto q os “Spring beans” (Objetos do Domínio (da Aplicação) instanciados e gerenciados pelo Spring). Este contexto dever ser criado usando outra abordagem (algo como: context = new ClassPathXmlApplicationContext(“applicationContext.xml” ); ). Para esta finalidade é desejável definir 1 ‘persistence.xml’ com 2 PU (1 com conexão configurada diretamente, pois vc não vai estar no Contexto Java Web/EE, e outra PU acessando realmente o DataSource q deve ser usando em Produção); e vc tb teria q manter 2 'applicationContext.xml’s: 1 p/ a App em Produção e o outro para Teste (p/ex.: ‘appTestContext.xml’). A vantagem disto é q vc pode fazer os testes totalmente independente de Container!! :mrgreen: Então, (atendendo a pedidos :lol: ) continuando o exemplo (JUnit no topo do Business-Core): (‘persistence.xml’) *1 <- mudei de idéia: vou colocar o exemplo em outro post pq este aki já está longo D+ (e tb p/ organização)! :roll:

D
Então, (atendendo a pedidos :lol: ) continuando o exemplo (JUnit no topo do Business-Core): Aki está o 'persistence.xml':
&lt;persistence ... &gt;
  &lt;persistence-unit name="agendaJPA2-corePU" transaction-type="RESOURCE_LOCAL"&gt;
    &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;
    &lt;!--non-jta-data-source&gt;java:/comp/env/jdbc/agendaDS&lt;/non-jta-data-source--&gt;
    &lt;properties&gt;
      &lt;property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/agenda"/&gt;
      &lt;property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/&gt;
      &lt;property name="javax.persistence.jdbc.user" value="root"/&gt;
      &lt;property name="hibernate.connection.password" value=""/&gt;
      &lt;property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/&gt;
    &lt;/properties&gt;
  &lt;/persistence-unit&gt;
  &lt;persistence-unit name="agendaJPAds-corePU" transaction-type="JTA"&gt;
    &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;
    &lt;!--validation-mode&gt;NONE&lt;/validation-mode--&gt;
    &lt;jta-data-source&gt;jdbc/agendaDS&lt;/jta-data-source&gt;
    &lt;properties/&gt;
  &lt;/persistence-unit&gt;
&lt;/persistence&gt;
(Obs.: substitua todos "agenda" pelo nome da sua Base de Dados.) Agora o 'appTestContext.xml' (deve ser adicionado o'.LocalEntityManagerFactoryBean' postado anteriormente):
&lt;beans xmlns=... &gt;
&lt;!-- JPA LocalEntityManagerFactoryBean (Se "persistenceUnitName" não é definido e   1 PU no persistence.xml, ela(ou a 1ª PU) é usada. --&gt;
    ...
    
    &lt;!-- Transaction manager para um JPA EntityManagerFactory simples (alternativa ao JTA) --&gt;
    &lt;bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"&gt;
        &lt;property name="entityManagerFactory" ref="entityManagerFactory"/&gt;
    &lt;/bean&gt;

&lt;!-- Instrui o Spring a realizar gerenciamento transacional declarativo automático nas classes anotadas.--&gt;
    &lt;tx:annotation-driven/&gt;
    
    &lt;!-- PostProcessors para realizar injeção de recursos de acordo com a especificação JPA (@PersistenceContext, @PersistenceUnit). --&gt;
    &lt;!-- Arquivo onde todos os Objetos (instanciados) declarados como &lt;bean . --&gt;
    &lt;import resource="appObjetos.xml" /&gt;

&lt;/beans&gt;
O 'applicationContext.xml' p/ ser usado p/ Aplicação em Produção (inclusive se vc deseja configurar o Transacional explicitamente no Spring usando a abordaem da JTA API):
&lt;beans xmlns=... &gt;
&lt;!-- JNDI Lookup via JndiTemplate: esta setting permite lookUp da DataSource reBindada no UnitTest.--&gt;
    &lt;bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"&gt;
		&lt;property name="environment"&gt;
			&lt;props&gt;
				&lt;prop key="java.naming.factory.initial"&gt;com.sun.jndi.fscontext.RefFSContextFactory&lt;/prop&gt;
				&lt;prop key="java.naming.provider.url"&gt;file:/&lt;/prop&gt;
			&lt;/props&gt;
		&lt;/property&gt;
	&lt;/bean&gt;
&lt;!-- Datasource de JNDI Lookup(via "jndiTemplate") &lt;- esta setting p/ ser usada em Produção: DataSource de Container Java.--&gt;
    &lt;bean id="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;
        &lt;property name="jndiTemplate"&gt;
              &lt;ref bean="jndiTemplate"/&gt;
        &lt;/property&gt;
        &lt;property name="jndiName"&gt;
              &lt;value&gt;java:/comp/env/jdbc/agendaDS&lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

&lt;!-- EntityManagerFactory &lt;- DataSource de Container Java(Se  + de 1 PU no persistence.xml, o nome da PU deve ser determinado em persistenceUnitName).--&gt;
    &lt;bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;
        &lt;!-- esta setting p/ ser usada em Produção: DataSource de Container Java.--&gt;
       &lt;property name="dataSource" ref="jndiDataSource"&gt;&lt;/property&gt;
       &lt;property name="persistenceUnitName" value="agendaJPAds-jarPU" /&gt;
       &lt;property name="jpaPropertyMap"&gt;
          &lt;map&gt;
            &lt;entry key="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/&gt;
            &lt;entry key="hibernate.transaction.flush_before_completion" value="true"/&gt;
            &lt;entry key="hibernate.transaction.auto_close_session" value="true"/&gt;
            &lt;entry key="hibernate.current_session_context_class" value="jta"/&gt;
            &lt;entry key="hibernate.connection.release_mode" value="auto"/&gt;
          &lt;/map&gt;
       &lt;/property&gt;
        &lt;!-- custom implementation p/ enriquecer o PersistenceUnitInfo read from the persistence.xml
         JPA configuration file with the JTA DataSource, specifying the JTA datasource directly in
         the Spring configuration file has the advantage that we can use a direct reference to the
         datasource instead of using a JNDI name as requied by the jta-data-source setting in the
         persistence.xml file --&gt;
       &lt;property name="persistenceUnitPostProcessors"&gt;
          &lt;list&gt;
             &lt;!-- Obs.: a Classe deste Objeto, "JtaPersistenceUnitPostProcessor", deve ser definida na App.--&gt;
             &lt;bean class="JtaPersistenceUnitPostProcessor"&gt;
                &lt;property name="jtaMode" value="true"&gt;&lt;/property&gt;
                &lt;property name="jtaDataSource" ref="jndiDataSource"&gt;&lt;/property&gt;
             &lt;/bean&gt;
          &lt;/list&gt;
       &lt;/property&gt;
        &lt;!-- customização do JPA Provider (neste caso o Hibernate). --&gt;
       &lt;property name="jpaVendorAdapter"&gt;
            &lt;bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"&gt;
                &lt;property name="showSql" value="true" /&gt;
                &lt;property name="generateDdl" value="false" /&gt;
                &lt;!--property name="database" value="MYSQL" /--&gt;
                &lt;property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /&gt;
            &lt;/bean&gt;
       &lt;/property&gt;
    &lt;/bean&gt;

&lt;!-- JTA Transaction Manager este setting p/ ser usada em Produção: Container Java.--&gt;
    &lt;bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"&gt;
       &lt;property name="transactionManagerName" value="java:/TransactionManager"&gt;&lt;/property&gt;
       &lt;property name="autodetectUserTransaction" value="false"&gt;&lt;/property&gt;
    &lt;/bean&gt;

&lt;!-- Instrui o Spring a realizar gerenciamento transacional declarativo automático nas classes anotadas.--&gt;
    &lt;tx:annotation-driven/&gt;
    
    &lt;!-- PostProcessors para realizar injeção de recursos de acordo com a especificação JPA (@PersistenceContext, @PersistenceUnit). --&gt;
    &lt;bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/&gt;
    
    &lt;!-- PostProcessors para realizar a conversão de exceções nas classes @Repository (das exceções nativas como JPA PersistenceExceptions to Spring's DataAccessException). --&gt;
    &lt;bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/&gt;
    

    &lt;!-- Será automaticamente transacional graças ao @Transactional. EntityManager irá ser auto-injetado graças ao @PersistenceContext. PersistenceExceptions irá ser auto-convertido graças ao @Repository. --&gt;
    &lt;!-- Arquivo onde todos os Objetos (instanciados) declarados como &lt;bean . --&gt;
    &lt;import resource="appObjetos.xml" /&gt;
&lt;/beans&gt;
Obs.: a implementação da Classe "JtaPersistenceUnitPostProcessor", pode ser obtida no link fornecido anteriormente. Agora o "appObjetos.xml" (usado por ambos 'app*Context.xml's):
&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;

    &lt;!-- O Spring é 1 Container FrameWork, portanto, se configurado via XML, todos os Objetos (instanciados) tem q ser definidos como &lt;bean . --&gt;
        &lt;!-- a não ser que esteja configurado com (Injeção de Dependecia via) Annotation Component-Scan. --&gt;
	    &lt;context:annotation-config/&gt;
	    &lt;context:component-scan base-package="domain.srvcFacade,domain.repository" use-default-filters="false"&gt;
            &lt;context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/&gt;
            &lt;context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/&gt;
	        &lt;!--context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/--&gt;
	    &lt;/context:component-scan&gt;
    &lt;bean id="usuario" class="domain.model.Usuario" scope="session" /&gt;
    &lt;!--bean id="usuarioRepo" class="domain.repository.UsuarioRepo" /&gt;
    &lt;bean id="usuarioServiceFcd" class="domain.srvcFacade.UsuarioServiceFcd"&gt;
        &lt;property name="usuarioRepo" ref="usuarioRepo" /&gt;
    &lt;/bean--&gt;
    &lt;bean ... &gt;
&lt;/beans&gt;
Eventualmente 1 DAO seguindo o padrão:
package domain.repository;

@Transactional
//@Scope(&quot;prototype&quot;) // esta @ somente no caso DI via Annotations
@Repository
public class UsuarioRepo {
    @PersistenceContext
    private EntityManager em;
    // demais codificações de Persistencia/Acesso a Dados...
}
O 'Domain Service':
package domain.srvcFacade;

@Service
public class UsuarioServiceFcd {
    @Autowired // esta @ somente no caso DI via Annotations (context:component-scan)
    private UsuarioRepo usuarioRepo;
    
    /** demais codificações de Serviço de Domínio... */
}
E finalmente o Caso de Teste 'UsuarioServiceFcdTest.java': voi la
public class UsuarioServiceFcdTest {
    
    private ApplicationContext context;
    UsuarioServiceFcd usuarioServiceFcd;
 /*...*/
        System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
                &quot;com.sun.jndi.fscontext.RefFSContextFactory&quot;);
        System.setProperty(Context.PROVIDER_URL, &quot;file:/&quot;); // change provider url to a platform specific path
        Context registry = new InitialDirContext();
        // create a new connection pool data source, read the properties
        // file
        // and bind it to a name
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        Properties dsProperties = new Properties();
        FileInputStream cpdsPropFile = new FileInputStream(&quot;C:/..**pathDirSeuProjeto**../test/jdbc.properties&quot;);// myconnection.properties created in step1
        dsProperties.load(cpdsPropFile);
        try {
            cpds.setDriverClass(dsProperties.getProperty(&quot;driverClass&quot;));
        } catch (PropertyVetoException ex) {
            Logger.getLogger(UsuarioServiceFcdTest.class.getName()).log(Level.SEVERE, null, ex);
        }
        cpds.setUser(dsProperties.getProperty(&quot;user&quot;));
        cpds.setDescription(&quot;java:/comp/env/jdbc/agendaDS&quot; + &quot; Data Source&quot;); //replace MYCONNECTIONKEY with the key you wish to use for lookup
        cpds.setPassword(dsProperties.getProperty(&quot;password&quot;));
        cpds.setJdbcUrl(dsProperties.getProperty(&quot;jdbcUrl&quot;));
        cpds.setIdleConnectionTestPeriod(1800);
        cpds.setMaxIdleTime(3000);
        cpds.setMaxStatements(50);
        cpds.setMaxPoolSize(5);
        cpds.setInitialPoolSize(3);
        cpds.setAcquireIncrement(5);
        cpds.setMinPoolSize(2);
        cpds.setTestConnectionOnCheckin(true);

        Connection conC3PO = cpds.getConnection();
        if (conC3PO != null){
            System.out.println(&quot; Success ; ;&quot;); //Success
        // ...
                registry.rebind(&quot;java:/comp/env/jdbc/agendaDS&quot;, cpds); //datasource
                // &quot;closing&quot; a connection sends it back to the pool
                conC3PO.close();
        } else {
        //Something wrong
        }

InitialContext ic = new InitialContext();
        //    ic.createSubcontext(&quot;java:&quot;);
        //    ic.createSubcontext(&quot;java:/comp&quot;);
        //    ic.createSubcontext(&quot;java:/comp/env&quot;);
        //    ic.createSubcontext(&quot;java:/comp/env/jdbc&quot;);
            // Construct DataSource = /* ...*/
        //    ic.bind(&quot;jdbc/agendaDS&quot;, datasource);

    //    Context webContext = (Context)ic.lookup(&quot;java:/comp/env&quot;);
        DataSource datasource2 = (DataSource)ic.lookup(&quot;java:/comp/env/jdbc/agendaDS&quot;); //DataSource datasource2 = (DataSource)webContext.lookup(&quot;jdbc/agendaDS&quot;) 
    //
        try {
             System.out.println(&quot;DB Schema/Catalog is &quot; + datasource2.getConnection().getCatalog().toString() ); //*StartedUp JNDI.
            Connection con = datasource2.getConnection(); // ds.getConnection(&quot;genius&quot;, &quot;abracadabra&quot;)
            System.out.println(&quot;Ds Context name is &quot; +  con.getCatalog().toString() );//datasource2.getConnection() *StartedUp JNDI.datasource2.getConnection().
            //con.setAutoCommit(false);
            //PreparedStatement pstmt = (PreparedStatement)con.prepareStatement( //
            //                            &quot;SELECT * FROM usuario&quot;); // NAME, NAME, TITLE TITLEPERSONNEL WHERE DEPT = ?
            ////pstmt.setString(1, &quot;SALES&quot;);
            //ResultSet rs = pstmt.executeQuery();
            String sQry = &quot;SELECT * FROM usuario&quot;; //any sQry
            Statement stmt = (Statement)con.prepareStatement(sQry);
            ResultSet rs = stmt.executeQuery(sQry); // sQry

            System.out.println(&quot;(testando) Buscando dados...&quot;); // Sales Department:
            while (rs.next() ) {
                    String name = rs.getString(&quot;NoME&quot;);
                    String title = rs.getString(&quot;login&quot;);
                    System.out.println(name + &quot;  ; ;&quot; + title);
            }
            rs.close();
            stmt.close();
            con.close();
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioServiceFcdTest.class.getName() ).log(Level.SEVERE, null, ex);
            throw new SQLException(&quot;SQLException: &quot; + ex.getMessage() );
        }
    //    System.out.println(&quot;JNDI Context name is &quot; + JNDIUnitTestHelper.getJndiName() );//*StartedUp JNDI.
        context = new ClassPathXmlApplicationContext(&quot;appTestContext.xml&quot;); // applicationContext // *2 &lt;- pode alternar quando estiver c/ o ambiente funcionando.
        usuarioServiceFcd = (UsuarioServiceFcd)context.getBean(&quot;usuarioServiceFcd&quot;);
  /*...*/
    @Test
    public void gravar() {
        
        System.out.println(&quot;gravar usuário&quot;);
        
        Usuario result = usuarioServiceFcd.gravar(usuarioTeste);
        try {
            assertNotNull(result.getIdUsuario() );
        } catch (AssertionError e){
            fail(&quot;Falhou a gravação de usuário! Falha: &quot; + e.getMessage() );
        }
    }
*2 :idea:<- ah e, a propósito, use a ferramenta de geração de JUnit Test's do netBeans e implemente seus testes a gosto (claro, sempre implemente os Testes Unitários antes de implementar qq funcionalidade)TDD!!! :XD: (Vc ficou me devendo a versão do seu netBeans. Aproveita e me passa a do Hibernate (presumo 3.5+) e o seu Spring (q parece ser a 3.x+: pq tentou usar @Resource).) Clareou 1 pouco?!!
K

E ai pessoal… muito bom o post!! dificil encontrar tutorial e documentacao usando Spring 3 e Hibernate 3…
Vms ao meu problema… devo esta errando alguma coisa…

Uso o JBoss 4.2.x + Spring 3 + Hibernate 3.5.1-Final

portal-DS.xml , localizado dentro do JBoss, na pasta deploy

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
   <local-tx-datasource>
      <jndi-name>portalDS</jndi-name>
      <connection-url>jdbc:postgresql://localhost:5432/portal</connection-url>
      <driver-class>org.postgresql.Driver</driver-class>
      <user-name>portal</user-name>
      <password>portal</password>
   </local-tx-datasource>
</datasources>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Persistence deployment descriptor for dev profile -->
<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="portalPU"
		transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:/portalDS</jta-data-source>
		<class>br.com.portal.entity.Ano</class>
		<class>br.com.portal.entity.Anunciante</class>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.connection.release_mode" value="auto" />
			<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
			<property name="jboss.entity.manager.factory.jndi.name" value="java:/autoPecasDataSource" />
	</persistence-unit>
</persistence>

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
	</context-param>

        ....
	<persistence-unit-ref>
		<description>Persistence unit for the bank application.</description>
		<persistence-unit-ref-name>persistence/portalPU</persistence-unit-ref-name>
		<persistence-unit-name>portalPU</persistence-unit-name>
	</persistence-unit-ref>
        ...
</web-app>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/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">

	<bean id="entityManagerFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="portalDS" />
	</bean>
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
	<context:component-scan base-package="br.com.portal.service" />
	<context:annotation-config />
	<tx:annotation-driven transaction-manager="transactionManager" />
</beans>

Se puderem me ajudar =)

Fato que to comentendo 'varios erros =)

[]ss

D

Por acaso vc tah testando (a gente)?! :shock: …

…ou, vc tah me tirando?! :hunf:

F

Não entendi !

D

@Flavio, apenas 1 mal-entendido. :confused: no problm!

@kubanacan,
Me parece q vc não teve 1 sacada do o q o Spring é e pq q ele serve.
No seu setUp vc adiciona 1 ‘persistence.xml’, mas no Spring vc insiste numa configuração Hibernate puro.

Em vez de usar JBoss, tente primeiro com o TomCat, seguindo suas Instruções de como definir 1 DataSource no Container Java.

Em todo caso, se vc quer ter sucesso no q precisa e decidir seguir algumas dicas q posso te passar é muito provável q vc chegue lá…

Se tiver a fim, é só avisar,

]o['s,

F

O spring faz uma integração entre o hibernate e o data source ai você vai usar o pool de conexões do servidor e não do hibernate.

D

Na verdade, um “pool de conexões” implica(só pode ser criado) num DataSource, este podendo ser definido tanto localmente na sua App. como num Container Java.
Inclusive, estes "Poolled-DataSource"s realmente implementam a interface ‘javax.sql.DataSource’. O Hibernate é naturalmente compatível com algumas dessas implementações: C3P0, DBCP, Proxool; sem falar na nativa do Hibernate, q a Hibernate não se cansa de indicar para não ser usada em Produção, por não ser robusta, etc…
Vide: javax.sql.DataSource cpds = new ComboPooledDataSource(); é natural!! 8)
Mas, por enquanto eskeça tudo isto.

Flavio machine:
O spring faz uma integração entre o hibernate e o data source ai você vai usar o pool de conexões do servidor e não do hibernate.
A proposta (boa a princípio) do Yury é definir 1 DataSource (Local) via Spring para podermos fazer Testes, inclusive de Performance/Carga (DataSource de Container: 1 Pool com determinada qtd. de conexões), simulando o Ambiente real de Produção. Para isso, ele definine 1 DataSource usando a Implementação C3P0; só q isso ele propõe a abordagem de settar a configuração do cpds (usando 1 “.PropertyPlaceholderConfigurer”)via arquivo ‘jdbc.properties’. (O problema é q isto traz 1 efeito colateral: a configuração de conexão (acesso ao BD) acaba ficando definida em 2 lugares; veja só a ambiguidade: sempre q vc, p/ acaso precise mundar qq coisa na confg, p/ex. a senha (ou ainda, o NomeDeAcesso), vai ter q fazer isso em 2 lugares, no ‘jdbc.properties’ e tb na PU do ‘persistence.xml’. (Até este ponto, todo seu Caso de Unit Test tem q estar “passando”, p/menos com o DataSource local! Ah, já ia me eskecendo: configure a Injeção de Dependencias via XML mesmo; faça sua aplicação (UnitTest) funcionar o + simples possível, mas p/- faça funcionar. :shock: )
Pois bem, a partir daí este ‘dataSource’ é injetado em um “.LocalContainerEntityManagerFactoryBean”. :arrow: Mas, de todo jeito, quando vc for definir 1 applicationContext para Produção, invariavelmente, vai ter q definir o ‘dataSource’, só q, desta vez, vai ter q recuperá-lo(do Container) via JNDI.

Flavio machine:
Porquê vc acha melhor eu tentar no tomCat ?
Simples, pq vc pode seguir a Documentação do TomCat, q é muito simples e objetiva, isso sem falar q deve chover de Tuts em portugues do TomCat. Sem mencionar, q o TomCat é muito + fácil de configurar e Starta bem + rápido q o JBoss.

Flavio machine:
Tenho interrese nas dicas sim. Vamo lá. :lol:
Obrigado

Bom, o basicão é isso aí… Se tiver dúvidas, problemas… é só postar!!

Criado 25 de janeiro de 2011
Ultima resposta 20 de abr. de 2011
Respostas 13
Participantes 3