Boa noite pessoal, estou tendo um problema com o @Transactional do Spring e acredito que esteja relacionado a utilização de Generics onde eu anoto a classe filha com @Transactional porém a classe pai que irá realizar as operações que devem utilizar transações! Por exemplo: Quando eu crio uma classe de Serviço concreta que instância um Dao concreto, e esta classe de serviço está anotada com @Transactional e chama o método save() do Dao através do Serviço por exemplo, tudo corre bem.
Porém quando eu possuo uma classe filha PessoaService anotada com @Transactional que extende para uma Classe genéria que é responsável por recuperar o Dao e chamar o método, o erro acontece.
org.hibernate.HibernateException: save is not valid without active transaction
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:340)
at $Proxy30.save(Unknown Source)
você configurou o gerenciador de transações do Spring?
D
darklordkamui
dica… aonde tiver processo de acesso a banco vc deve por o @Transactional
no seu caso só faltou por no GenericService, coloque nele que ja vai funcionar
D
djeffersonx
Sim o Spring está configurado certinho, tanto que quando eu faço uma classe concreta ele funciona.
Eu já coloquei o @Transactional na GenericService, mas quando eu faço isso, não consigo mais recuperar o PessoaService no contexto do Spring, no caso o PessaService fica com @Service apenas, e o GenericService com o @Transactional, mas quando eu faço isso não consigo mais recuperar o PessoaService do contexto do spring, o Spring me diz que não tem esse Bean.
To pensando em gerenciar as transações na mão memsmo, fazer un session.beginTransaction() e depois um commit, afinal é só isso uq o spring faz pra mim msm certo ?
Abrç, e obrigado pela atenção!
K
kicolobo
Nâo é mais fácil você simplesmente incluir as anotações na classe pai já de uma vez?
Tenho de verificar o código fonte do Spring: se bobear, ele só lê as anotações da classe filha ignorando os métodos da classe pai.
D
darklordkamui
djeffersonx:
Sim o Spring está configurado certinho, tanto que quando eu faço uma classe concreta ele funciona.
Eu já coloquei o @Transactional na GenericService, mas quando eu faço isso, não consigo mais recuperar o PessoaService no contexto do Spring, no caso o PessaService fica com @Service apenas, e o GenericService com o @Transactional, mas quando eu faço isso não consigo mais recuperar o PessoaService do contexto do spring, o Spring me diz que não tem esse Bean.
To pensando em gerenciar as transações na mão memsmo, fazer un session.beginTransaction() e depois um commit, afinal é só isso uq o spring faz pra mim msm certo ?
Abrç, e obrigado pela atenção!
a implementação do seu GenericDao vc anotou com @Transactional ?
tira do GenericService a anotação…
D
djeffersonx
Se eu coloco @Transactional no GenericDao, acontece a mesma coisa que acorre com o service, que ai o spring não recupera mais a classe filha, que no caso estaria anotada com @Repository tipo:
Sim o Spring está configurado certinho, tanto que quando eu faço uma classe concreta ele funciona.
Eu já coloquei o @Transactional na GenericService, mas quando eu faço isso, não consigo mais recuperar o PessoaService no contexto do Spring, no caso o PessaService fica com @Service apenas, e o GenericService com o @Transactional, mas quando eu faço isso não consigo mais recuperar o PessoaService do contexto do spring, o Spring me diz que não tem esse Bean.
To pensando em gerenciar as transações na mão memsmo, fazer un session.beginTransaction() e depois um commit, afinal é só isso uq o spring faz pra mim msm certo ?
Abrç, e obrigado pela atenção!
mas entao… vc precisa falar pro spring que a sua GenericService deve entrar no contexto… nao é para se colocar @transaction em serviço, só em dao’s de preferencia… anota a generic com @Service somente e faz igual eu falei anteriormente… e me diz se continua dando o erro
D
djeffersonx
Fiz como você falou, coloquei na GenericService as anotações @Service e @Transactional apenas extendi a PessoaService para GenericService, porém desta forma o Spring não está registrando a classe PessoaService no contexto, pois deta forma ele está lançando a exception: