[RESOLVIDO] Spring + JPA injetando o entityManagerFactory

Revendo, você seguiu esses itens:

  1. Configurou o Spring e os seus beans?
  2. Colocou o OpenEntityManagerInViewFilter no web.xml?
  3. Colocou @PersistenceContext nos EntityManagers?
  4. Os DAOs que devem receber o PersistenceContext estão sendo criados pelo Spring e não por um new Object()?
  5. Sua aplicação possui os Listeners do Spring necessários para carregar o AplicationContext e fazer o ciclo de vida? São eles o org.springframework.web.context.ContextLoaderListener e o org.springframework.web.context.request.RequestContextListener.
  6. Configurou o context-param contextConfigLocation dizendo qual seu arquivo XML do spring?

Se você fez tudo isso e aparenta estar tudo correto, da uma rodada em alguma classe de teste como desktop applicatione veja se as injeções nesses DAOs são feitas corretamente. Creio que não esqueci nenhum passo. Depois volta a postar aqui, quem sabe alguem alem de mim tenta te ajudar ^^ Estou tentando te ajudar a tanto tempo que vai ver eu fiquei tão viciado no seu codigo quanto você e também não consigo mais enxergar algum erro besta…

Olá Guilherme!!!
Eu não estava injetando depêndencia na minha DAO, estava criando-a a partir de um new Object();
Agora fiz isso :slight_smile: :

	<bean name="/hello.htm" class="orm.controller.Teste" >
		<property name="productDAO" ref="productDAO" />
	</bean>

Agora deu outro tipo de exception, dizendo não é possível cria a transação compartilhando o EntityManager e diz que eu use ou o Spring transaction ou um tal de EJB CMT:


SEVERE: Servlet.service() for servlet jpa threw exception
java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:163)
	at $Proxy9.getTransaction(Unknown Source)
	at orm.dataaccess.dao.ProductDAO.insert(ProductDAO.java:17)
	at orm.controller.Teste.handleRequest(Teste.java:30)
	at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)

Creio que eu sei o que é isso. Você está usando o filtro OpenEntityManagerInViewFilter com as annotations @Transactional, que fazem o trabalho de criar o EntityManager e o escopo de transação para você, além de todo o esquema de tratamento de exceções e rollback.

Mas, mesmo tendo todo esse controle do Spring, você deve estar fazendo algo do tipo:

@PersistenceContext
private EntityManager entityManager;

//...//

@Transactional
public void salvar(Entity entity){
  entityManager.getTransaction().begin();
  entityManager.persist(entity);
  entityManager.flush();
  entityManager.getTransaction().commit();
}

Se o próprio Spring se responsabiliza pelo ciclo de transação, pra que se preocupar usando essa forma declarativa? Substitua tudo isso por apenas:

@PersistenceContext
private EntityManager entityManager;

//...//

@Transactional
public void salvar(Entity entity){
  entityManager.persist(entity);
}
1 curtida

Funcionoooouuu :smiley: :smiley: :smiley:

Era isso mesmo que estava acontecendo. Muito obrigada mesmo pela ajuda Guilherme, valew!! Agora só falta eu estudar bem esse código pra ter uma compreensão melhor.

Então esse JPaTransactionManager, vai fazer todo o controle de transação automático, mesmo quando for entre mais tabelas?

Ele vai fazer o controle dentro do escopo de transação, seja la quantas tabelas você mexeu.

Meus amigos estou iniciando o estudo com Spring… estou tentando implementar exemplos pequenos para comecar entender como ele funciona.

No meu exemplo estou com a seguinte situacao.
Tenho um classe ApplicationContext.xml com os beans declarados… nao sei se estao declarados corretamente, alguem me ajude, por favor,

<?xml version="1.0" encoding="UTF-8"?>
      <property name = "impressora" ref = "impressoraBean"/>
      <property name = "teclado" ref = "tecladoBean"/>
      <property name = "monitor" ref = "monitorBean"/>

</bean>

<bean id = "impressoraBean"
      class = "Impressora"/>

<bean id = "tecladoBean"
      class = "Teclado"/>

<bean id = "monitorBean"
      class = "Monitor"/>

estou implementando um classe para testar o exemplo, porem esta dando erro na declaracao do ApplicationContext e na classPathXmlApplicationContext

public class IniciaUsandoSpring {
public static void main(String[] args){

[color=red] ApplicationContext [/color]applicationContext = new [color=darkred]ClassPathXmlApplicationContext/color;

Computador computador = (Computador)
applicationContext.getBean(“computadorBean”);

computador.ligar();
}

}

sera que preciso configurar alguma coisa? ou importar alguma biblioteca?
alguem pode me ajudar?

Abraços
Ezequiel

Olá Scopet,

estava dando uma olhada em seu código e vi que o nome do seu xml é applicationContext.xml e na sua classe vc está chamando o ApplicationContext.xml com A maiúsculo. o nome do arquivo deve ser igual. Qualquer coisa poste a exception.

Uma dica: quando for postar códigos use a tag code para formatação, assim fica mais fácil a visualização.

Meu amigo… eu tinha criado o applicationContext, com a minusculo, depois renomei com o A maisculo pois achei q fosse isso,
mas nao resolveu…

nao ta reconhecendo o ApplicationContext e nem o ClassPathXmlApplicationContext

[code]

public class IniciaUsandoSpring {
public static void main(String[] args){

[color=red]ApplicationContext[/color] applicationContext = new [color=red]ClassPathXmlApplicationContext/color;

Computador computador = (Computador)
applicationContext.getBean(“computadorBean”);

computador.ligar();
}

}[/code]

Opaa
Consegui resolver…

adicionei a biblioteca Spring Framework 2.5

e fiz as importacoes abaixo ai funcionou…

import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;

blz obrigado!