I am currently working on a prototype of a Spring/Hibernate replacement for our existing EJB2 tier. The basis for our approach has been the "Don't Repeat the DAO" article by Per Mellqvist located at:
http://www.ibm.com/developerworks/java/ ... icdao.html
One departure from this article has been the use of annotations to have the annotated named queries in the persistent beans. I suppose that this ok, however, my DAO interfaces often just contain finder methods that mirror the NamedQueries located in the persistent beans. Like so..
__Bean class________
@NamedQueries({
@NamedQuery(name="Subscription.findByFeatureKeyword",
query="from Subscription s where s.name like :keyword"),
@NamedQuery(name="Subscription.findByActive",
query="from Subscription s where s.active = ?")
})
@Entity
@Table(name="subscriptions")
public class Subscription
implements Serializable {
//etc....
__DAO Interface_____
public interface SubscriptionDao extends GenericDao <Subscription, Long> {
public List findByFeatureKeyword( String keyword);
public List findByActive(boolean active );
}
It would make more sense to me that the named query annotations be located in the interface along side the corresponding method declarations.
However, when I try to move the queries to the DAO and add the DAO to the hibernate.cfg, like so...
<mapping class="com.XXX.subscription.dao.SubscriptionDao"/>
(I realize the hacky-ness of this approach)
The class is not bound on start-up and when I try to use the query I get this exception..
[2007-10-01 16:12:37]org.hibernate.MappingException: Named query not known: Subscription.findByFeatureKeyword
[2007-10-01 16:12:37] at org.hibernate.impl.AbstractSessionImpl.getNamedQuery(AbstractSessionImpl.java:70)
[2007-10-01 16:12:37] at org.hibernate.impl.SessionImpl.getNamedQuery(SessionImpl.java:1260)
[2007-10-01 16:12:37] at com.XXX.core.dao.genericdao.GenericDaoHibernateImpl.prepareQuery(GenericDaoHibernateImpl.java:103)
[2007-10-01 16:12:37] at com.XXX.core.dao.genericdao.GenericDaoHibernateImpl.executeFinder(GenericDaoHibernateImpl.java:84)
[2007-10-01 16:12:37] at com.XXX.core.dao.genericdao.finder.impl.FinderIntroductionInterceptor.invoke(FinderIntroductionInterceptor.java:25)
[2007-10-01 16:12:37] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
[2007-10-01 16:12:37] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
[2007-10-01 16:12:37] at $Proxy23.findByFeatureKeyword(Unknown Source)
[2007-10-01 16:12:37] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[2007-10-01 16:12:37] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[2007-10-01 16:12:37] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[2007-10-01 16:12:37] at java.lang.reflect.Method.invoke(Method.java:597)
[2007-10-01 16:12:37] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
[2007-10-01 16:12:37] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
[2007-10-01 16:12:37] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
[2007-10-01 16:12:37] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
[2007-10-01 16:12:37] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
[2007-10-01 16:12:37] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
[2007-10-01 16:12:37] at $Proxy24.findByFeatureKeyword(Unknown Source)
[2007-10-01 16:12:37] at com.XXX.opal.service.OpalInfoSvcImpl.populateWithDownloadOpalInfo(OpalInfoSvcImpl.java:69)
[2007-10-01 16:12:37] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[2007-10-01 16:12:37] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[2007-10-01 16:12:37] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[2007-10-01 16:12:37] at java.lang.reflect.Method.invoke(Method.java:597)
[2007-10-01 16:12:37] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
[2007-10-01 16:12:37] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
[2007-10-01 16:12:37] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
[2007-10-01 16:12:37] at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:126)
[2007-10-01 16:12:37] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
[2007-10-01 16:12:37] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
[2007-10-01 16:12:37] at $Proxy25.populateWithDownloadOpalInfo(Unknown Source)
[2007-10-01 16:12:37] at com.nextgame.struts.action.OpalLoginAction.execute(OpalLoginAction.java:250)
[2007-10-01 16:12:37] at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
[2007-10-01 16:12:37] at com.nextgame.struts.requestprocessor.PleaseWaitRequestProcessor.processActionPerform(PleaseWaitRequestProcessor.java:107)
[2007-10-01 16:12:37] at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
[2007-10-01 16:12:37] at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
[2007-10-01 16:12:37] at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
[2007-10-01 16:12:37] at javax.servlet.http.HttpServlet.service(HttpServlet.java:126)
[2007-10-01 16:12:37] at javax.servlet.http.HttpServlet.service(HttpServlet.java:103)
[2007-10-01 16:12:37] at com.caucho.server.http.FilterChainServlet.doFilter(FilterChainServlet.java:96)
[2007-10-01 16:12:37] at com.nextgame.filter.HibernateFilter.doFilter(HibernateFilter.java:27)
[2007-10-01 16:12:37] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:37] at com.nextgame.filter.CacheHeaderFilter.doFilter(CacheHeaderFilter.java:83)
[2007-10-01 16:12:37] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:37] at com.nextgame.filter.CacheHeaderFilter.doFilter(CacheHeaderFilter.java:83)
[2007-10-01 16:12:37] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:37] at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:350)
[2007-10-01 16:12:37] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:37] at com.nextgame.filter.SecureFilter.doFilter(SecureFilter.java:51)
[2007-10-01 16:12:37] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:37] at com.nextgame.filter.LicenseeFilter.doFilter(LicenseeFilter.java:169)
[2007-10-01 16:12:37] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:37] at com.nextgame.filter.P3PFilter.doFilter(P3PFilter.java:39)
[2007-10-01 16:12:37] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:37] at com.nextgame.filter.ArcadeFilter.doFilter(ArcadeFilter.java:162)
[2007-10-01 16:12:37] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:37] at com.XXX.burrito.BurritoFilter.doFilter(BurritoFilter.java:116)
[2007-10-01 16:12:37] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:37] at com.caucho.server.http.Invocation.service(Invocation.java:315)
[2007-10-01 16:12:37] at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
[2007-10-01 16:12:37] at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:253)
[2007-10-01 16:12:37] at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:170)
[2007-10-01 16:12:37] at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
[2007-10-01 16:12:37] at java.lang.Thread.run(Thread.java:619)
[2007-10-01 16:12:38]com.XXX.core.service.exception.ServiceException: org.hibernate.MappingException: Named query not known: Subscription.findByFeatureKeyword
[2007-10-01 16:12:38] at com.XXX.core.spring.aop.XXXServiceMethodThrowsAdvice.afterThrowing(XXXServiceMethodThrowsAdvice.java:23)
[2007-10-01 16:12:38] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[2007-10-01 16:12:38] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[2007-10-01 16:12:38] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[2007-10-01 16:12:38] at java.lang.reflect.Method.invoke(Method.java:597)
[2007-10-01 16:12:38] at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invokeHandlerMethod(ThrowsAdviceInterceptor.java:146)
[2007-10-01 16:12:38] at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:131)
[2007-10-01 16:12:38] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
[2007-10-01 16:12:38] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
[2007-10-01 16:12:38] at $Proxy25.populateWithDownloadOpalInfo(Unknown Source)
[2007-10-01 16:12:38] at com.nextgame.struts.action.OpalLoginAction.execute(OpalLoginAction.java:250)
[2007-10-01 16:12:38] at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
[2007-10-01 16:12:38] at com.nextgame.struts.requestprocessor.PleaseWaitRequestProcessor.processActionPerform(PleaseWaitRequestProcessor.java:107)
[2007-10-01 16:12:38] at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
[2007-10-01 16:12:38] at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
[2007-10-01 16:12:38] at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
[2007-10-01 16:12:38] at javax.servlet.http.HttpServlet.service(HttpServlet.java:126)
[2007-10-01 16:12:38] at javax.servlet.http.HttpServlet.service(HttpServlet.java:103)
[2007-10-01 16:12:38] at com.caucho.server.http.FilterChainServlet.doFilter(FilterChainServlet.java:96)
[2007-10-01 16:12:38] at com.nextgame.filter.HibernateFilter.doFilter(HibernateFilter.java:27)
[2007-10-01 16:12:38] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:38] at com.nextgame.filter.CacheHeaderFilter.doFilter(CacheHeaderFilter.java:83)
[2007-10-01 16:12:38] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:38] at com.nextgame.filter.CacheHeaderFilter.doFilter(CacheHeaderFilter.java:83)
[2007-10-01 16:12:38] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:38] at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:350)
[2007-10-01 16:12:38] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:38] at com.nextgame.filter.SecureFilter.doFilter(SecureFilter.java:51)
[2007-10-01 16:12:38] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:38] at com.nextgame.filter.LicenseeFilter.doFilter(LicenseeFilter.java:169)
[2007-10-01 16:12:38] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:38] at com.nextgame.filter.P3PFilter.doFilter(P3PFilter.java:39)
[2007-10-01 16:12:38] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:38] at com.nextgame.filter.ArcadeFilter.doFilter(ArcadeFilter.java:162)
[2007-10-01 16:12:38] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:38] at com.XXX.burrito.BurritoFilter.doFilter(BurritoFilter.java:116)
[2007-10-01 16:12:38] at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)
[2007-10-01 16:12:38] at com.caucho.server.http.Invocation.service(Invocation.java:315)
[2007-10-01 16:12:38] at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
[2007-10-01 16:12:38] at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:253)
[2007-10-01 16:12:38] at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:170)
[2007-10-01 16:12:38] at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
[2007-10-01 16:12:38] at java.lang.Thread.run(Thread.java:619)
[2007-10-01 16:12:38]Caused by: org.hibernate.MappingException: Named query not known: Subscription.findByFeatureKeyword
[2007-10-01 16:12:38] at org.hibernate.impl.AbstractSessionImpl.getNamedQuery(AbstractSessionImpl.java:70)
[2007-10-01 16:12:38] at org.hibernate.impl.SessionImpl.getNamedQuery(SessionImpl.java:1260)
[2007-10-01 16:12:38] at com.XXX.core.dao.genericdao.GenericDaoHibernateImpl.prepareQuery(GenericDaoHibernateImpl.java:103)
[2007-10-01 16:12:38] at com.XXX.core.dao.genericdao.GenericDaoHibernateImpl.executeFinder(GenericDaoHibernateImpl.java:84)
[2007-10-01 16:12:38] at com.XXX.core.dao.genericdao.finder.impl.FinderIntroductionInterceptor.invoke(FinderIntroductionInterceptor.java:25)
[2007-10-01 16:12:38] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
[2007-10-01 16:12:38] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
[2007-10-01 16:12:38] at $Proxy23.findByFeatureKeyword(Unknown Source)
[2007-10-01 16:12:38] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[2007-10-01 16:12:38] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[2007-10-01 16:12:38] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[2007-10-01 16:12:38] at java.lang.reflect.Method.invoke(Method.java:597)
[2007-10-01 16:12:38] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
[2007-10-01 16:12:38] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
[2007-10-01 16:12:38] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
[2007-10-01 16:12:38] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
[2007-10-01 16:12:38] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
[2007-10-01 16:12:38] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
[2007-10-01 16:12:38] at $Proxy24.findByFeatureKeyword(Unknown Source)
[2007-10-01 16:12:38] at com.XXX.opal.service.OpalInfoSvcImpl.populateWithDownloadOpalInfo(OpalInfoSvcImpl.java:69)
[2007-10-01 16:12:38] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[2007-10-01 16:12:38] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
[2007-10-01 16:12:38] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
[2007-10-01 16:12:38] at java.lang.reflect.Method.invoke(Method.java:597)
[2007-10-01 16:12:38] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
[2007-10-01 16:12:38] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
[2007-10-01 16:12:38] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
[2007-10-01 16:12:38] at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:126)
[2007-10-01 16:12:38] ... 36 more
Has anyone successfully done this? Every example I have found online of using annotated named queries places them in the persistent bean. Anyone have any ideas? This is obviously not mission critical, but it would be nice.