Chamar procedure usando EntityManager

7 respostas
jason_bourne

Pessoal,

Preciso chamar uma procedure usando o EntityManager do Hibernate. Tem como fazer isso? Tentei usar o prepareCall mas ele precisa de uma Connection e não um EntityManager.

Se alguem tiver uma luz, mt obrigado :slight_smile:

7 Respostas

Lavieri

existe uma forma bem bizarra de fazer.. é triste... é feio... mas as vezes é a vida... eu não sei chamar o Procedure de outra forma.... mas assim dá!

EntityManager em = getEnittyManager(); //abstraindo como vc recebe o EntityManager...

Connection con = ((HibernateEntityManager)em).getSession().connection();

... bom dessa forma você consegue pegar a conexão através de um EntityManager do Hibernate... é feio, é errado, mas é a forma que sei fazer...

jason_bourne
Lavieri:
existe uma forma bem bizarra de fazer.. é triste... é feio... mas as vezes é a vida... eu não sei chamar o Procedure de outra forma.... mas assim dá!
EntityManager em = getEnittyManager(); //abstraindo como vc recebe o EntityManager...

Connection con = ((HibernateEntityManager)em).getSession().connection();

... bom dessa forma você consegue pegar a conexão através de um EntityManager do Hibernate... é feio, é errado, mas é a forma que sei fazer...

Estou tento esse erro:

javax.ejb.EJBException: java.lang.ClassCastException: org.jboss.ejb3.entity.InjectedEntityManager cannot be cast to org.hibernate.ejb.HibernateEntityManager

L

Antes de mais nada:

  1. Está usando EJB3?

  2. A conexão ao banco é obtida via DataSource/JNDI? (Se não sabe, mande seu persistence.xml)

Por que isso? Porque é possível obter a conexão como um DataSource direto, sem intermédio do Hibernate. Talvez seja a melhor opção.

jason_bourne

Leonardo3001:
Antes de mais nada:

  1. Está usando EJB3?

  2. A conexão ao banco é obtida via DataSource/JNDI? (Se não sabe, mande seu persistence.xml)

Por que isso? Porque é possível obter a conexão como um DataSource direto, sem intermédio do Hibernate. Talvez seja a melhor opção.

Sim…acho q é EJB3, a aplicação usa o EntityManager do javax.persistence

A conexão usa datasource. Segue o persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
	<persistence-unit name="user_adm">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:/jdbc/aplicOracleDS</jta-data-source>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
			<property name="hibernate.show_sql" value="false" />
			<property name="hibernate.format_sql" value="true" />
		</properties>
	</persistence-unit>
</persistence>
Lavieri
eduacsp:
Lavieri:
existe uma forma bem bizarra de fazer.. é triste... é feio... mas as vezes é a vida... eu não sei chamar o Procedure de outra forma.... mas assim dá!
EntityManager em = getEnittyManager(); //abstraindo como vc recebe o EntityManager...

Connection con = ((HibernateEntityManager)em).getSession().connection();

... bom dessa forma você consegue pegar a conexão através de um EntityManager do Hibernate... é feio, é errado, mas é a forma que sei fazer...

Estou tento esse erro:

javax.ejb.EJBException: java.lang.ClassCastException: org.jboss.ejb3.entity.InjectedEntityManager cannot be cast to org.hibernate.ejb.HibernateEntityManager

pq vcs nunca leem o stacktrace do erro ?? ta descrito ai bem simples...

org.jboss.ejb3.entity.InjectedEntityManager não pode ser castado em HibernateEntityManager... ou seja...

no lugar de

Connection con = ((HibernateEntityManager)em).getSession().connection();

use

Connection con = ((InjectedEntityManager)em).getSession().connection();

o problema é que na sua aplicação o objeto real é uma InjectedentityManager

M

Usando createNativeQuery funciona

jason_bourne
Lavieri:
eduacsp:
Lavieri:
existe uma forma bem bizarra de fazer.. é triste... é feio... mas as vezes é a vida... eu não sei chamar o Procedure de outra forma.... mas assim dá!
EntityManager em = getEnittyManager(); //abstraindo como vc recebe o EntityManager...

Connection con = ((HibernateEntityManager)em).getSession().connection();

... bom dessa forma você consegue pegar a conexão através de um EntityManager do Hibernate... é feio, é errado, mas é a forma que sei fazer...

Estou tento esse erro:

javax.ejb.EJBException: java.lang.ClassCastException: org.jboss.ejb3.entity.InjectedEntityManager cannot be cast to org.hibernate.ejb.HibernateEntityManager

pq vcs nunca leem o stacktrace do erro ?? ta descrito ai bem simples...

org.jboss.ejb3.entity.InjectedEntityManager não pode ser castado em HibernateEntityManager... ou seja...

no lugar de

Connection con = ((HibernateEntityManager)em).getSession().connection();

use

Connection con = ((InjectedEntityManager)em).getSession().connection();

o problema é que na sua aplicação o objeto real é uma InjectedentityManager

Agora o erro que dá é esse:

ObjectName: jboss.j2ee:ear=SYST.ear,jar=SYSTEjb.jar,name=ItemBean,service=EJB3 State: FAILED Reason: java.lang.RuntimeException: java.lang.NoClassDefFoundError: javax/annotation/PostConstruct I Depend On: persistence.units:ear=SYST.ear,jar=SYSTEjb.jar,unitName=user_adm
Criado 7 de agosto de 2009
Ultima resposta 3 de set. de 2009
Respostas 7
Participantes 4