You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomee.apache.org by chawax <ol...@gmail.com> on 2008/07/11 15:50:21 UTC
PersistenceContext and Hibernate session
Hi,
In my application, I have two persistence contexts for the same persistence
unit, one for JPA, the other for Hibernate :
/**
* Inject persistence context t4Seam
*/
@javax.persistence.PersistenceContext(unitName = "t4Seam")
protected javax.persistence.EntityManager emanager;
/**
* Inject Hibernate Session
*/
@javax.persistence.PersistenceContext(unitName = "t4Seam")
protected org.hibernate.Session hibernateSession;
It used to work with JBoss. But with OpenEJB, I have the following error:
"Use of @PersistenceContext only applies to EntityManager references"
Is it intented or is it a bug ?
Olivier
--
View this message in context: http://www.nabble.com/PersistenceContext-and-Hibernate-session-tp18404318p18404318.html
Sent from the OpenEJB User mailing list archive at Nabble.com.
Re: PersistenceContext and Hibernate session
Posted by Dain Sundstrom <da...@iq80.com>.
On Jul 15, 2008, at 2:32 PM, David Blevins wrote:
> On Jul 15, 2008, at 6:11 AM, chawax wrote:
>
>>
>> I finally could make it work with JBoss AS ... but it doesn't work
>> the same
>> as Open EJB !
>> On JBoss AS the getDelegate method returns Hibernate session, while
>> it
>> returns Hibernate entity manager on Open EJB.
>
> Congrats, glad you got it to work in both platforms!
>
>> So to make it work, I made
>> this :
>>
>> protected javax.persistence.EntityManager emanager;
>>
>> protected org.hibernate.Session hibernateSession;
>>
>> @javax.persistence.PersistenceContext(unitName = "t4Seam")
>> public void setEntityManager(javax.persistence.EntityManager
>> entityManager) {
>> this.emanager = entityManager;
>> if (entityManager.getDelegate() instanceof
>> org.hibernate.ejb.HibernateEntityManager) {
>> this.hibernateSession =
>> ((org.hibernate.ejb.HibernateEntityManager)
>> entityManager.getDelegate()).getSession();
>> }
>> else {
>> this.hibernateSession = (org.hibernate.Session)
>> entityManager.getDelegate();
>> }
>> }
>>
>> So I have a question : which one is right with this, Open EJB or
>> JBoss AS ?
>> Or maybe the JPA specifications are not clear about this, so there
>> can be
>> different implementations for this method ?
>
> The spec simply says "The result of this method is implementation
> specific." So either version is valid strictly speaking.
>
> On that note, we could add a flag that would have our getDelegate()
> detect if it's hibernate and return the hibernate session if that
> would make your life easier.
It would be cool if we could just support org.hibernate.Session as a
recognized injection type. Then anyone using code similar to the
original code posted would just work.
-dain
Re: PersistenceContext and Hibernate session
Posted by David Blevins <da...@visi.com>.
On Jul 15, 2008, at 6:11 AM, chawax wrote:
>
> I finally could make it work with JBoss AS ... but it doesn't work
> the same
> as Open EJB !
> On JBoss AS the getDelegate method returns Hibernate session, while it
> returns Hibernate entity manager on Open EJB.
Congrats, glad you got it to work in both platforms!
> So to make it work, I made
> this :
>
> protected javax.persistence.EntityManager emanager;
>
> protected org.hibernate.Session hibernateSession;
>
> @javax.persistence.PersistenceContext(unitName = "t4Seam")
> public void setEntityManager(javax.persistence.EntityManager
> entityManager) {
> this.emanager = entityManager;
> if (entityManager.getDelegate() instanceof
> org.hibernate.ejb.HibernateEntityManager) {
> this.hibernateSession =
> ((org.hibernate.ejb.HibernateEntityManager)
> entityManager.getDelegate()).getSession();
> }
> else {
> this.hibernateSession = (org.hibernate.Session)
> entityManager.getDelegate();
> }
> }
>
> So I have a question : which one is right with this, Open EJB or
> JBoss AS ?
> Or maybe the JPA specifications are not clear about this, so there
> can be
> different implementations for this method ?
The spec simply says "The result of this method is implementation
specific." So either version is valid strictly speaking.
On that note, we could add a flag that would have our getDelegate()
detect if it's hibernate and return the hibernate session if that
would make your life easier.
-David
Re: PersistenceContext and Hibernate session
Posted by chawax <ol...@gmail.com>.
I finally could make it work with JBoss AS ... but it doesn't work the same
as Open EJB !
On JBoss AS the getDelegate method returns Hibernate session, while it
returns Hibernate entity manager on Open EJB. So to make it work, I made
this :
protected javax.persistence.EntityManager emanager;
protected org.hibernate.Session hibernateSession;
@javax.persistence.PersistenceContext(unitName = "t4Seam")
public void setEntityManager(javax.persistence.EntityManager
entityManager) {
this.emanager = entityManager;
if (entityManager.getDelegate() instanceof
org.hibernate.ejb.HibernateEntityManager) {
this.hibernateSession = ((org.hibernate.ejb.HibernateEntityManager)
entityManager.getDelegate()).getSession();
}
else {
this.hibernateSession = (org.hibernate.Session)
entityManager.getDelegate();
}
}
So I have a question : which one is right with this, Open EJB or JBoss AS ?
Or maybe the JPA specifications are not clear about this, so there can be
different implementations for this method ?
-Olivier
chawax wrote:
>
> Thanks Dain, your suggestion worked perfect with OpenEJB.
>
> But it doesn't work with JBoss AS 4.2.x. I have this error :
> java.lang.ClassCastException: org.hibernate.impl.SessionImpl
>
> Anyway, that's not an Open EJB issue, so I will ask on Hibernate or JBoss
> forums.
>
> Thanks.
>
> -Olivier
>
>
> Dain Sundstrom wrote:
>>
>> You'll want to do something like this:
>>
>> @javax.persistence.PersistenceContext(unitName = "t4Seam")
>> protected javax.persistence.EntityManager emanager;
>>
>> public HibernateEntityManager getHibernateSession() {
>> return (HibernateEntityManager) emanager.getDelegate();
>> }
>>
>> public void doIt() {
>> getHibernateSession().doSomething();
>> }
>>
>> -dain
>>
>
>
--
View this message in context: http://www.nabble.com/PersistenceContext-and-Hibernate-session-tp18404318p18464923.html
Sent from the OpenEJB User mailing list archive at Nabble.com.
Re: PersistenceContext and Hibernate session
Posted by chawax <ol...@gmail.com>.
Thanks Dain, your suggestion worked perfect with OpenEJB.
But it doesn't work with JBoss AS 4.2.x. I have this error :
java.lang.ClassCastException: org.hibernate.impl.SessionImpl
Anyway, that's not an Open EJB issue, so I will ask on Hibernate or JBoss
forums.
Thanks.
-Olivier
Dain Sundstrom wrote:
>
> You'll want to do something like this:
>
> @javax.persistence.PersistenceContext(unitName = "t4Seam")
> protected javax.persistence.EntityManager emanager;
>
> public HibernateEntityManager getHibernateSession() {
> return (HibernateEntityManager) emanager.getDelegate();
> }
>
> public void doIt() {
> getHibernateSession().doSomething();
> }
>
> -dain
>
--
View this message in context: http://www.nabble.com/PersistenceContext-and-Hibernate-session-tp18404318p18460735.html
Sent from the OpenEJB User mailing list archive at Nabble.com.
Re: PersistenceContext and Hibernate session
Posted by David Blevins <da...@visi.com>.
Hi Olivier,
This document may help you understand how things work from a high level.
http://cwiki.apache.org/OPENEJBx30/jpa-concepts.html
The section of bullet points for "With <persistence-unit transaction-
type="TRANSACTION">" has a good description of what's going on. When
reading it, in your mind substitute every occurrence of
"PersistenceContext/Cache" with "HibernateEntityManager instance".
-David
On Jul 11, 2008, at 8:55 AM, Dain Sundstrom wrote:
> JtaEntityManager is a wrapper around the raw EntityManager instance
> we get from the JPA provider. JtaEntityManager performs the task
> required by the EJB spec such as committing the flushing the JPA
> data at the end of the transaction and assuring that all access to
> the same persistence unit in a transaction uses the same raw
> EntityManager. You can get access to the raw underlying
> EntityManager by calling getDelegate(), but be careful. You should
> not cache the results of getDelegate() as the raw EntityManager
> instance will change for each transaction. You'll want to do
> something like this:
>
> @javax.persistence.PersistenceContext(unitName = "t4Seam")
> protected javax.persistence.EntityManager emanager;
>
> public HibernateEntityManager getHibernateSession() {
> return (HibernateEntityManager) emanager.getDelegate();
> }
>
> public void doIt() {
> getHibernateSession().doSomething();
> }
>
> -dain
>
> On Jul 11, 2008, at 8:09 AM, chawax wrote:
>
>>
>> I tried this :
>>
>> protected org.hibernate.ejb.HibernateEntityManager emanager;
>>
>> @javax.persistence.PersistenceContext(unitName = "t4Seam")
>> public void setEntityManager(javax.persistence.EntityManager
>> entityManager) {
>> this.emanager = (org.hibernate.ejb.HibernateEntityManager)
>> entityManager;
>> }
>>
>> But I have a ClassCastException :
>>
>> java.lang.ClassCastException:
>> org.apache.openejb.persistence.JtaEntityManager
>>
>> Is there a place where I could configure the entity manager to use
>> Hibernate
>> one instead of OpenEJB one ?
>> --
>> View this message in context: http://www.nabble.com/PersistenceContext-and-Hibernate-session-tp18404318p18406052.html
>> Sent from the OpenEJB User mailing list archive at Nabble.com.
>>
>
>
Re: PersistenceContext and Hibernate session
Posted by Dain Sundstrom <da...@iq80.com>.
JtaEntityManager is a wrapper around the raw EntityManager instance we
get from the JPA provider. JtaEntityManager performs the task
required by the EJB spec such as committing the flushing the JPA data
at the end of the transaction and assuring that all access to the same
persistence unit in a transaction uses the same raw EntityManager.
You can get access to the raw underlying EntityManager by calling
getDelegate(), but be careful. You should not cache the results of
getDelegate() as the raw EntityManager instance will change for each
transaction. You'll want to do something like this:
@javax.persistence.PersistenceContext(unitName = "t4Seam")
protected javax.persistence.EntityManager emanager;
public HibernateEntityManager getHibernateSession() {
return (HibernateEntityManager) emanager.getDelegate();
}
public void doIt() {
getHibernateSession().doSomething();
}
-dain
On Jul 11, 2008, at 8:09 AM, chawax wrote:
>
> I tried this :
>
> protected org.hibernate.ejb.HibernateEntityManager emanager;
>
> @javax.persistence.PersistenceContext(unitName = "t4Seam")
> public void setEntityManager(javax.persistence.EntityManager
> entityManager) {
> this.emanager = (org.hibernate.ejb.HibernateEntityManager)
> entityManager;
> }
>
> But I have a ClassCastException :
>
> java.lang.ClassCastException:
> org.apache.openejb.persistence.JtaEntityManager
>
> Is there a place where I could configure the entity manager to use
> Hibernate
> one instead of OpenEJB one ?
> --
> View this message in context: http://www.nabble.com/PersistenceContext-and-Hibernate-session-tp18404318p18406052.html
> Sent from the OpenEJB User mailing list archive at Nabble.com.
>
Re: PersistenceContext and Hibernate session
Posted by chawax <ol...@gmail.com>.
I tried this :
protected org.hibernate.ejb.HibernateEntityManager emanager;
@javax.persistence.PersistenceContext(unitName = "t4Seam")
public void setEntityManager(javax.persistence.EntityManager
entityManager) {
this.emanager = (org.hibernate.ejb.HibernateEntityManager)
entityManager;
}
But I have a ClassCastException :
java.lang.ClassCastException:
org.apache.openejb.persistence.JtaEntityManager
Is there a place where I could configure the entity manager to use Hibernate
one instead of OpenEJB one ?
--
View this message in context: http://www.nabble.com/PersistenceContext-and-Hibernate-session-tp18404318p18406052.html
Sent from the OpenEJB User mailing list archive at Nabble.com.
Re: PersistenceContext and Hibernate session
Posted by chawax <ol...@gmail.com>.
Yes, Hibernate is not part of JPA (even though JPA is based on concepts
created by Hibernate). But it can be used as a JPA implementation, then it
adds features to JPA ones (criterias for example).
I think my problem is that org.hibernate.Session does not implement
javax.persistence.EntityManager, so it looks like OpenEJB is right when it
throws an error about this ;)
I found there's a org.hibernate.ejb.HibernateEntityManager that implements
javax.persistence.EntityManager, I think I should use this one instead of
org.hibernate.Session. I'm going to test this.
Martin Vysny-2 wrote:
>
> On Fri, 2008-07-11 at 06:50 -0700, chawax wrote:
>> Hi,
>>
>> In my application, I have two persistence contexts for the same
>> persistence
>> unit, one for JPA, the other for Hibernate :
>>
>> /**
>> * Inject persistence context t4Seam
>> */
>> @javax.persistence.PersistenceContext(unitName = "t4Seam")
>> protected javax.persistence.EntityManager emanager;
>>
>> /**
>> * Inject Hibernate Session
>> */
>> @javax.persistence.PersistenceContext(unitName = "t4Seam")
>> protected org.hibernate.Session hibernateSession;
>>
>> It used to work with JBoss. But with OpenEJB, I have the following error:
>> "Use of @PersistenceContext only applies to EntityManager references"
>>
>> Is it intented or is it a bug ?
>>
>> Olivier
>
> I think it's intended: Hibernate API is not part of JPA/EJB3
> specification afaik.
>
> Martin
>
>
>
--
View this message in context: http://www.nabble.com/PersistenceContext-and-Hibernate-session-tp18404318p18404898.html
Sent from the OpenEJB User mailing list archive at Nabble.com.
Re: PersistenceContext and Hibernate session
Posted by Martin Vysny <mv...@whitestein.com>.
On Fri, 2008-07-11 at 06:50 -0700, chawax wrote:
> Hi,
>
> In my application, I have two persistence contexts for the same persistence
> unit, one for JPA, the other for Hibernate :
>
> /**
> * Inject persistence context t4Seam
> */
> @javax.persistence.PersistenceContext(unitName = "t4Seam")
> protected javax.persistence.EntityManager emanager;
>
> /**
> * Inject Hibernate Session
> */
> @javax.persistence.PersistenceContext(unitName = "t4Seam")
> protected org.hibernate.Session hibernateSession;
>
> It used to work with JBoss. But with OpenEJB, I have the following error:
> "Use of @PersistenceContext only applies to EntityManager references"
>
> Is it intented or is it a bug ?
>
> Olivier
I think it's intended: Hibernate API is not part of JPA/EJB3
specification afaik.
Martin