[jboss-cvs] jboss-seam/src/main/org/jboss/seam/persistence ...
Gavin King
gavin.king at jboss.com
Thu Oct 4 20:43:21 EDT 2007
User: gavin
Date: 07/10/04 20:43:21
Modified: src/main/org/jboss/seam/persistence
PersistenceContexts.java
HibernatePersistenceProvider.java
PersistenceProvider.java
Log:
Fix prob when Hibernate is in cp, but is *not* implementing this EM
Revision Changes Path
1.4 +8 -3 jboss-seam/src/main/org/jboss/seam/persistence/PersistenceContexts.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: PersistenceContexts.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/persistence/PersistenceContexts.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- PersistenceContexts.java 22 Jun 2007 09:28:51 -0000 1.3
+++ PersistenceContexts.java 5 Oct 2007 00:43:21 -0000 1.4
@@ -81,15 +81,20 @@
PersistenceContextManager pcm = (PersistenceContextManager) Contexts.getConversationContext().get(name);
if (pcm!=null)
{
+ try
+ {
pcm.changeFlushMode(flushMode);
}
+ catch (UnsupportedOperationException uoe) {
+ //swallow
+ }
+ }
}
}
public void beforeRender()
{
- PersistenceProvider pp = PersistenceProvider.instance();
- flushMode = pp==null ? FlushModeType.MANUAL : pp.getRenderFlushMode();
+ flushMode = FlushModeType.MANUAL;
changeFlushModes();
}
1.24 +147 -61 jboss-seam/src/main/org/jboss/seam/persistence/HibernatePersistenceProvider.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: HibernatePersistenceProvider.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/persistence/HibernatePersistenceProvider.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- HibernatePersistenceProvider.java 4 Oct 2007 01:54:40 -0000 1.23
+++ HibernatePersistenceProvider.java 5 Oct 2007 00:43:21 -0000 1.24
@@ -1,11 +1,14 @@
package org.jboss.seam.persistence;
import static org.jboss.seam.annotations.Install.FRAMEWORK;
+
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
+
import javax.persistence.EntityManager;
import javax.transaction.Synchronization;
+
import org.hibernate.EntityMode;
import org.hibernate.FlushMode;
import org.hibernate.Hibernate;
@@ -16,7 +19,6 @@
import org.hibernate.type.VersionType;
import org.jboss.seam.ScopeType;
import org.jboss.seam.Seam;
-import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@@ -113,6 +115,10 @@
{
return proxySession( (Session) delegate );
}
+ catch (NotHibernateException nhe)
+ {
+ return super.proxyDelegate(delegate);
+ }
catch (Exception e)
{
throw new RuntimeException("could not proxy delegate", e);
@@ -122,13 +128,29 @@
@Override
public void setFlushModeManual(EntityManager entityManager)
{
+ try
+ {
getSession(entityManager).setFlushMode(FlushMode.MANUAL);
}
+ catch (NotHibernateException nhe)
+ {
+ super.setFlushModeManual(entityManager);
+ }
+ }
+
@Override
public boolean isDirty(EntityManager entityManager)
{
+ try
+ {
return getSession(entityManager).isDirty();
}
+ catch (NotHibernateException nhe)
+ {
+ return super.isDirty(entityManager);
+ }
+ }
+
@Override
public Object getId(Object bean, EntityManager entityManager)
{
@@ -136,25 +158,47 @@
{
return getSession(entityManager).getIdentifier(bean);
}
+ catch (NotHibernateException nhe)
+ {
+ return super.getId(bean, entityManager);
+ }
catch (TransientObjectException e)
{
return super.getId(bean, entityManager);
}
}
+
@Override
public Object getVersion(Object bean, EntityManager entityManager)
{
+ try
+ {
return getVersion( bean, getSession(entityManager) );
}
+ catch (NotHibernateException nhe)
+ {
+ return super.getVersion(bean, entityManager);
+ }
+ }
@Override
public void checkVersion(Object bean, EntityManager entityManager, Object oldVersion, Object version)
{
+ try
+ {
checkVersion(bean, getSession(entityManager), oldVersion, version);
}
+ catch (NotHibernateException nhe)
+ {
+ super.checkVersion(bean, entityManager, oldVersion, version);
+ }
+ }
+
@Override
public void enableFilter(Filter f, EntityManager entityManager)
{
+ try
+ {
org.hibernate.Filter filter = getSession(entityManager).enableFilter( f.getName() );
for ( Map.Entry<String, ValueExpression> me: f.getParameters().entrySet() )
{
@@ -162,26 +206,68 @@
}
filter.validate();
}
+ catch (NotHibernateException nhe)
+ {
+ super.enableFilter(f, entityManager);
+ }
+
+ }
@Override
public boolean registerSynchronization(Synchronization sync, EntityManager entityManager)
{
+ try
+ {
//TODO: just make sure that a Hibernate JPA EntityTransaction
// delegates to the Hibernate Session transaction
getSession(entityManager).getTransaction().registerSynchronization(sync);
return true;
}
+ catch (NotHibernateException nhe)
+ {
+ return super.registerSynchronization(sync, entityManager);
+ }
+
+ }
@Override
- public FlushModeType getRenderFlushMode()
+ public String getName(Object bean, EntityManager entityManager)
+ {
+ try
+ {
+ return getSession(entityManager).getEntityName(bean);
+ }
+ catch (NotHibernateException nhe)
+ {
+ return super.getName(bean, entityManager);
+ }
+ catch (TransientObjectException e)
{
- return FlushModeType.MANUAL;
+ return super.getName(bean, entityManager);
+ }
}
- private Session getSession(EntityManager entityManager)
+ @Override
+ public EntityManager proxyEntityManager(EntityManager entityManager)
+ {
+ if (FULL_TEXT_ENTITYMANAGER_PROXY_CONSTRUCTOR==null)
{
- return (Session) entityManager.getDelegate();
+ return super.proxyEntityManager(entityManager);
}
+ else
+ {
+ try
+ {
+ return (EntityManager) FULL_TEXT_ENTITYMANAGER_PROXY_CONSTRUCTOR.newInstance( FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR.invoke(null, entityManager) );
+ }
+ catch (Exception e)
+ {
+ //throw new RuntimeException("could not proxy FullTextEntityManager", e);
+ return super.proxyEntityManager(entityManager);
+ }
+ }
+ }
+
public static void checkVersion(Object value, Session session, Object oldVersion, Object version)
{
ClassMetadata classMetadata = getClassMetadata(value, session);
@@ -191,12 +277,14 @@
throw new StaleStateException("current database version number does not match passivated version number");
}
}
+
public static Object getVersion(Object value, Session session)
{
ClassMetadata classMetadata = getClassMetadata(value, session);
return classMetadata!=null && classMetadata.isVersioned() ?
classMetadata.getVersion(value, EntityMode.POJO) : null;
}
+
private static ClassMetadata getClassMetadata(Object value, Session session)
{
Class entityClass = Seam.getEntityClass( value.getClass() );
@@ -215,48 +303,23 @@
return classMetadata;
}
+ /**
+ * Returns the class of the specified Hibernate entity
+ */
@Override
- public String getName(Object bean, EntityManager entityManager)
- {
- try
- {
- return getSession(entityManager).getEntityName(bean);
- }
- catch (TransientObjectException e)
- {
- return super.getName(bean, entityManager);
- }
- }
- @Override
- public EntityManager proxyEntityManager(EntityManager entityManager)
- {
- if (FULL_TEXT_ENTITYMANAGER_PROXY_CONSTRUCTOR==null)
- {
- return super.proxyEntityManager(entityManager);
- }
- else
+ public Class getBeanClass(Object bean)
{
try
{
- return (EntityManager) FULL_TEXT_ENTITYMANAGER_PROXY_CONSTRUCTOR.newInstance( FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR.invoke(null, entityManager) );
- }
- catch (Exception e)
- {
- throw new RuntimeException("could not proxy FullTextEntityManager", e);
- }
+ return super.getBeanClass(bean);
}
- }
-
- /**
- * Returns the class of the specified hibernate bean
- */
- @Override
- public Class getBeanClass(Object bean)
+ catch (IllegalArgumentException iae)
{
return Hibernate.getClass(bean);
}
+ }
- @Override
+ /*@Override
public Method getPostLoadMethod(Class beanClass)
{
return null;
@@ -267,6 +330,7 @@
{
return null;
}
+
@Override
public Method getPreUpdateMethod(Class beanClass)
{
@@ -277,5 +341,27 @@
public Method getPreRemoveMethod(Class beanClass)
{
return null;
+ }*/
+
+ private Session getSession(EntityManager entityManager)
+ {
+ Object delegate = entityManager.getDelegate();
+ if ( delegate instanceof Session )
+ {
+ return (Session) delegate;
+ }
+ else
+ {
+ throw new NotHibernateException();
}
+ }
+
+ /**
+ * Occurs when Hibernate is in the classpath, but this particular
+ * EntityManager is not from Hibernate
+ *
+ * @author Gavin King
+ *
+ */
+ static class NotHibernateException extends IllegalArgumentException {}
}
1.22 +6 -13 jboss-seam/src/main/org/jboss/seam/persistence/PersistenceProvider.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: PersistenceProvider.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/persistence/PersistenceProvider.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- PersistenceProvider.java 4 Oct 2007 01:54:40 -0000 1.21
+++ PersistenceProvider.java 5 Oct 2007 00:43:21 -0000 1.22
@@ -1,14 +1,16 @@
package org.jboss.seam.persistence;
import static org.jboss.seam.annotations.Install.BUILT_IN;
+
import java.lang.reflect.Method;
import java.util.Date;
+
import javax.persistence.EntityManager;
import javax.persistence.OptimisticLockException;
import javax.transaction.Synchronization;
+
import org.jboss.seam.Component;
import org.jboss.seam.Entity;
import org.jboss.seam.ScopeType;
-import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@@ -121,17 +123,6 @@
{
return (PersistenceProvider) Component.getInstance(PersistenceProvider.class, ScopeType.STATELESS);
}
- /**
- * What flush policy should we use during the render response phase?
- * We should not be changing data during the render, so we can
- * optimize performance by choosing not to flush.
- *
- * @return COMMIT or MANUAL
- */
- public FlushModeType getRenderFlushMode()
- {
- return FlushModeType.COMMIT;
- }
/**
* Wrap the delegate before returning it to the application
@@ -167,6 +158,7 @@
{
return Entity.forClass(beanClass).getPrePersistMethod();
}
+
public Method getPreUpdateMethod(Class beanClass)
{
return Entity.forClass(beanClass).getPreUpdateMethod();
@@ -176,4 +168,5 @@
{
return Entity.forClass(beanClass).getPreRemoveMethod();
}
+
}
More information about the jboss-cvs-commits
mailing list