2010-12-08 25 views
0

我正在进行一点练习,并且在调用select查询时遇到一些问题。在Hibernate中使用继承时的问题

基本上我在下面的方法创建一个抽象类:

//AbstractStage 
entity --class ~.AbstractStage --mappedSuperclass --abstract 
field date --fieldName datetime --type java.util.Date --notNull 
field boolean --fieldName iscomplete --type java.util.boolean 

和两个子类如下:

// 
// HappyStage 
// 
entity --table happy_stage --class ~.HappyStage --extends ~.AbstractStage --testAutomatically --identifierField id --identifierColumn id_happy_stage 
field boolean --fieldName isSad --type java.util.boolean 
field date --fieldName dateOfDeath --type java.util.Date --notNull 
finder add findHappyStagesByIscomplete 

// 
    // HStage 
    // 
    entity --table h_stage --class ~.HStage --extends ~.AbstractStage --testAutomatically --identifierField id --identifierColumn id_h_stage 
    field boolean --fieldName isHappy --type java.util.boolean 
    field date --fieldName dateOfBirth --type java.util.Date --notNull 

我的环境是:

Java 
SpringTool 
Roo 
Hibernate 

我也运行一个持久袋鼠命令:

persistence setup --provider HIBERNATE --database MYSQL 

然后我写了控制器类如下:

package test; 

import java.util.Date; 

import javax.persistence.EntityManager; 
import javax.persistence.TypedQuery; 

import org.springframework.roo.addon.web.mvc.controller.RooWebScaffold; 
import test.HappyStage; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.stereotype.Controller; 

@RooWebScaffold(path = "happystages", formBackingObject = HappyStage.class) 
@RequestMapping("/happystages") 
@Controller 
public class HappyStageController { 

@RequestMapping(value="/happy", method=RequestMethod.GET) 
public String get() throws Exception 
{ 

// TypedQuery<AbstractStage> queryResults = HappyStage.findAbstractStagesByIscomplete(true); 
    Date dd = new Date(); 
    TypedQuery<AbstractStage> queryResults = HappyStage.findAbstractStagesByDateGreaterThan(dd); 

    System.err.println("N.of abstractstages found: " + queryResults.getResultList().size()); 
    return "redirect:/InheritanceTest"; 
} 

} 

HappyStage有方法findAbstractStagesByDateGreaterThan。这个想法是从子类中调用这个方法,并获取日期大于的所有抽象阶段。

q = em.createQuery("FROM test.AbstractStage AS abstractstage WHERE abstractstage.datetime > :datetime", AbstractStage.class); 

这里是HappyStage类代码:

package test; 

import test.AbstractStage; 
import org.springframework.roo.addon.javabean.RooJavaBean; 
import org.springframework.roo.addon.tostring.RooToString; 
import org.springframework.roo.addon.entity.RooEntity; 
import java.util.Date; 
import javax.validation.constraints.NotNull; 
import javax.persistence.EntityManager; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 
import javax.persistence.TypedQuery; 
import org.springframework.format.annotation.DateTimeFormat; 

@RooJavaBean 
@RooToString 
@RooEntity(identifierField = "id", identifierColumn = "id_happy_stage", table = "happy_stage", finders = { "findHappyStagesByIscomplete", "findHappyStagesByDatetimeGreaterThan" }) 
public class HappyStage extends AbstractStage { 

    private Boolean isSad; 

    @NotNull 
    @Temporal(TemporalType.TIMESTAMP) 
    @DateTimeFormat(style = "S-") 
    private Date dateOfDeath; 

    public static TypedQuery<AbstractStage> findAbstractStagesByIscomplete(Boolean iscomplete) throws Exception { 
     if (iscomplete == null) throw new IllegalArgumentException("The iscomplete argument is required"); 
     EntityManager em = HappyStage.entityManager(); 
     TypedQuery<AbstractStage> q = null; 
     try { 
      q = em.createQuery("FROM test.AbstractStage AS abstractstage WHERE abstractstage.iscomplete = :iscomplete", AbstractStage.class); 
      q.setParameter("iscomplete", iscomplete); 

     } catch (Exception exp) { 
      System.err.println("Ex message:\n" + exp + "\nStack trace \n"); 

      int stLenght = exp.getStackTrace().length; 
      StackTraceElement [] ste = exp.getStackTrace(); 
     for(int i=0; i<stLenght; i++){ 
      System.err.println("message [" + i + "]" + ste[i].toString());   
     } 
      throw(exp); 

     } 
     return q; 
    } 


    public static TypedQuery<AbstractStage> findAbstractStagesByDateGreaterThan(Date datetime) throws Exception { 

     EntityManager em = HappyStage.entityManager(); 
     TypedQuery<AbstractStage> q = null; 
     try { 
      q = em.createQuery("FROM test.AbstractStage AS abstractstage WHERE abstractstage.datetime > :datetime", AbstractStage.class); 
     q.setParameter("datetime", datetime); 

     } catch (Exception exp) { 
      System.err.println("Ex message:\n" + exp); 
      throw(exp); 
     } 
     return q; 
    }  

} 

的问题是,当我运行的代码在服务器上,然后转到* /happystages /快乐我得到一个空指针异常与以下堆栈跟踪: *

org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:281) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365) 
$Proxy48.createQuery(Unknown Source) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) 
$Proxy49.createQuery(Unknown Source) 
test.HappyStage.findAbstractStagesByDateGreaterThan_aroundBody2(HappyStage.java:55) 
test.HappyStage.findAbstractStagesByDateGreaterThan(HappyStage.java:1) 
test.HappyStageController.get(HappyStageController.java:25) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.traceNextValve(HttpRequestOperationCollectionValve.java:90) 
com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.java:76) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:409) 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
java.lang.Thread.run(Thread.java:680) 

运行,我们已经确定了JUnit测试,可能的错误是在异常链接到休眠如何处理SQL查询。添加一些断点,我们发现,这可能是所涉及的代码:

/** 
* Abstract implementation of the Query interface. 
* 
* @author Gavin King 
* @author Max Andersen 
*/ 

public abstract class AbstractQueryImpl implements Query { 

.... 
public Type[] getReturnTypes() throws HibernateException { 
    return session.getFactory().getReturnTypes(queryString); 
} 

... 
} 

我们现在正在打破码多一点,但* 我在想,如果你们已经经历了类似的问题。有什么我失踪?将抽象类作为父类还是有必要将其作为“具体”类来使用? *对于我来说,看起来很奇怪,你不能拥有一个抽象类并对其进行扩展,然后使用它根据继承的值查询所有子类。

请问我澄清,因为我的问题可能没有得到妥善解释。

问候

PS:我已经试过也没有在抽象类的--Abstract关键字。它仍然无法正常工作,并且在开始使用/开心和触发get方法时会给我这个期待(调用:TypedQuery queryResults = HappyStage。findAbstractStagesByDateGreaterThan(dd); )”

org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:281) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365) 
$Proxy48.createQuery(Unknown Source) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) 
$Proxy49.createQuery(Unknown Source) 
test.HappyStage.findAbstractStagesByDateGreaterThan_aroundBody2(HappyStage.java:55) 
test.HappyStage.findAbstractStagesByDateGreaterThan(HappyStage.java:1) 
test.HappyStageController.get(HappyStageController.java:25) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.traceNextValve(HttpRequestOperationCollectionValve.java:90) 
com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.java:76) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:409) 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
java.lang.Thread.run(Thread.java:680) 

看来,它没有与MySQL和摘要做,因为我还翻译使用的休眠变成一个真正的SQL查询的话SQL查询,我已经在运行MySQL的外壳直接

回答