Colocou o OpenEntityManagerInViewFilter no web.xml?
Colocou @PersistenceContext nos EntityManagers?
Os DAOs que devem receber o PersistenceContext estão sendo criados pelo Spring e não por um new Object()?
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.
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…
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:
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?
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;
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.