Seam with Hibernate Search
neilac333 Jan 17, 2008 2:49 PMI am using Hibernate Search in my Seam web application. All my unit tests and integration tests (using SeamTest), which are quite rigorous, are passing with flying colors. I should note that the tests are of two categories:
1) My use of the Hibernate Search libraries outside of any container
2) My use of Seam components that coordinate getting parameters and results to and from mock versions of my HS code
Nowhere do I perform an integration test of Seam components with the real HS implementation. Perhaps I should have since when I try to use the functionality in my actual application, I get the following:
java.lang.ClassCastException: org.jboss.seam.persistence.FullTextHibernateSessionProxy at org.hibernate.search.impl.FullTextSessionImpl.<init>(FullTextSessionImpl.java:70) at org.hibernate.search.Search.createFullTextSession(Search.java:21) at org.hibernate.search.jpa.impl.FullTextEntityManagerImpl.getFullTextSession(FullTextEntityManagerImpl.java:37) at org.hibernate.search.jpa.impl.FullTextEntityManagerImpl.createFullTextQuery(FullTextEntityManagerImpl.java:60) at persistence.search.SearchImpl.getAdvancedSearchResults(SearchImpl.java:185) at jrockit.reflect.VirtualNativeMethodInvoker.invoke(Ljava.lang.Object;[Ljava.lang.Object;)Ljava.lang.Object;(Unknown Source) at java.lang.reflect.Method.invoke(Ljava.lang.Object;[Ljava.lang.Object;I)Ljava.lang.Object;(Unknown Source) at org.jboss.seam.util.Reflections.invoke(Reflections.java:21) at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56) at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:31) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:46) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:42) at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:106) at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:155) at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:91) at persistence.search.SearchImpl_$$_javassist_1.getAdvancedSearchResults()Ljava.util.List;(SearchImpl_$$_javassist_1.java:???) at web.SearchAction.doAdvancedSearch(SearchAction.java:186) at jrockit.reflect.VirtualNativeMethodInvoker.invoke(Ljava.lang.Object;[Ljava.lang.Object;)Ljava.lang.Object;(Unknown Source) at java.lang.reflect.Method.invoke(Ljava.lang.Object;[Ljava.lang.Object;I)Ljava.lang.Object;(Unknown Source) at org.jboss.seam.util.Reflections.invoke(Reflections.java:21) at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31)
What is interesting to me is that FullTextHibernateSessionProxy is a Seam class not part of the Hibernate Search library. According to this
http://docs.jboss.com/seam/2.0.0.GA/api/org/jboss/seam/persistence/HibernateSessionProxy.html
...it looks like the class implements org.hibernate.Session. However, look here:
http://anonsvn.jboss.org/repos/hibernate/search/trunk/src/java/org/hibernate/search/impl/FullTextSessionImpl.java
If I am correct, the instance of FullTextHibernateSessionProxy is being cast to org.hibernate.classic.Session, EventSource, and SessionImplementor while FullTextHibernateSessionProxy implements org.hibernate.Session, SessionImplementor, and not EventSource at all.
Is my analysis correct? If so, is this a bug in the way Seam and HS collaborate? Most importantly, how can I work around this before I fall too far behind?
Thanks for any insight.