写代码的过程中遇到这样的问题:
我有一个基础数据表类 Parameter.java 这个表是双主键形式,配置文件如下:<class name="lxt.entity.Parameter" table="tb_parameter" catalog="transport">
        <composite-id name="id" class="lxt.entity.ParameterId">
            <key-property name="paramType" type="string">
                <column name="PARAM_TYPE" length="50" />
            </key-property>
            <key-property name="paramKey" type="string">
                <column name="PARAM_KEY" length="50" />
            </key-property>
        </composite-id>
        .
        .
        .现在有这样的一个问题
我的dao根据id查询方法如下:public Object get(Class<?> clazz, Serializable id)
{
Object o = getHibernateTemplate().get(clazz, id); if (o == null)
{
throw new ObjectRetrievalFailureException(clazz, id);
} return o;
}写其他的类的时候我知道在service里如下调用:public TruckInfo loadTruckById(String truckId) {
return (TruckInfo) this.truckDao.get(TruckInfo.class, truckId);
}现在对于这个双主键该怎么调用呢?this.parameterDao.get(Parameter.class, paramType);//Parameter.class里没有paramType这个属性
                                                   //ParameterId.class 这个类没有映射,hibernate找不到
对于这个问题,请高手指点下。

解决方案 »

  1.   


    <composite-id name="id" class="lxt.entity.ParameterId">
    复合主键是个类(ParameterId)而且这个类要 implements SerializableDAO层没有问题。
    SERVICE层将
    public TruckInfo loadTruckById(String truckId) {
            return (TruckInfo) this.truckDao.get(TruckInfo.class, truckId);
        }
    改成:public TruckInfo loadTruckById(ParameterId truckId) {
            return (TruckInfo) this.truckDao.get(TruckInfo.class, truckId);
        }就可以了
      

  2.   


    TestUnit:Parameter pt = new Parameter();
    pt.setKey1("abc"); //设置复合主键1
    pt.setKey2("DAF");//设置复合主键2也可在Parameter写一个符合主键的构造函数public Parameter(){}
    public Parameter(key1,key2...){
       this.key1 = key1;
      ..
    }此时就可以通过构造函数调用了Parameter pt = new Parameter(key1,key2);
    service.loadTruckById(pt);
      

  3.   

    2楼说的方法中,那么action里怎么写呢?
    我这样写,但是报错
    ParameterId truckType = new ParameterId("truckType","");
    paramter = parameterService.loadByParamType(truckType);
      

  4.   


    action层只不过是调用service层的方法而已,仅仅只是个类方法调用。分层只不过是感官上的,实际上还不是调用底层方法!最好吧你的报错信息发出来,不然还是没法分析的!
      

  5.   

    这是错误信息:
    2011-10-11 17:40:12,393 DEBUG [http-8080-2] (SQLStatementLogger.java:111) - select parameter0_.PARAM_TYPE as PARAM1_11_0_, parameter0_.PARAM_KEY as PARAM2_11_0_, parameter0_.PARAM_VALUE as PARAM3_11_0_, parameter0_.PARAM_DESC as PARAM4_11_0_ from transport.tb_parameter parameter0_ where parameter0_.PARAM_TYPE=? and parameter0_.PARAM_KEY=?
    org.springframework.orm.ObjectRetrievalFailureException: Object of class [lxt.entity.Parameter] with identifier [lxt.entity.ParameterId@33103b26]: not found
    at lxt.dao.impl.ABseDaoImpl.get(ABseDaoImpl.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy5.get(Unknown Source)
    at lxt.service.impl.ParameterServiceImpl.loadByParamType(ParameterServiceImpl.java:18)
    at lxt.action.TruckAction.AddPre(TruckAction.java:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at lxt.action.core.LoginFilter.doFilter(LoginFilter.java:37)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
    at java.lang.Thread.run(Unknown Source)
      

  6.   


    SQL 语句都打印出来了。你确定你的数据库中存在.PARAM_TYPE=? and parameter0_.PARAM_KEY=? 为你传入的值数据?
      

  7.   

    确定
    但是那个sql好像不对了吧
    PARAM_TYPE和PARAM_KEY是ParameterId类里的
      

  8.   


    难道你说的双主键不是复合主键的意思!!!!
    你的ParameterId类中的属性其实就是你多该表复合主键的封装。比如表复合主键为column1和column2
    那么ParameterId中就是column1和column2.
      

  9.   


    你既然是复合主键,那么在通过主键查询时的SQL肯定是:
    select * from table where table.key1 = ? and table.key2 = ? -- 其中primary key(key1,key2)针对你的select parameter0_.PARAM_TYPE as PARAM1_11_0_, parameter0_.PARAM_KEY as PARAM2_11_0_, parameter0_.PARAM_VALUE as PARAM3_11_0_, parameter0_.PARAM_DESC as PARAM4_11_0_ from transport.tb_parameter parameter0_ where parameter0_.PARAM_TYPE=? and parameter0_.PARAM_KEY=?我认为PARAM_TYPE 和PARAM_KEY是transport.tb_parameter的复合主键。如果你认为不是(由于看不到你的表结构)那么,你应该看下你的映射文件是否配置正确。其实报错信息主要是说没法找到复合主键为你制定数值的那条记录而已。在hibernate中,出现这种情况,有可能是你设置了外键,但在主表中,根据外键的值在映射表中根本找不到这条数据导致的。
      

  10.   

    可是怎么才能看数据表结构呢?
    我确定是双主键没有外键,我刚才改了下action:
    ParameterId truckType = new ParameterId();
    truckType.setParamType("truckType");
    paramter = parameterService.loadByParamType(truckType);
    这个表是基础数据表,ParamType是类型,PARAM_KEY是参数id,现在我要根据类型查询所有的id和value
    我按照上面的写法打印的数据库信息是:
    select parameter0_.PARAM_TYPE as PARAM1_11_0_, parameter0_.PARAM_KEY as PARAM2_11_0_, parameter0_.PARAM_VALUE as PARAM3_11_0_, parameter0_.PARAM_DESC as PARAM4_11_0_ from transport.tb_parameter parameter0_ where parameter0_.PARAM_TYPE=? and parameter0_.PARAM_KEY=?
    这个重点是怎么这个参数里有 parameter0_.PARAM_KEY=? 呢
    我不要这个参数啊。。
    现在已经不报错了,但是查不出结果啊
      

  11.   

    “可是怎么才能看数据表结构呢?” !! 这个怎么回答你呢!你没表结构么?
    “这个重点是怎么这个参数里有 parameter0_.PARAM_KEY=? 呢
    我不要这个参数啊。”你把log4j改成debug模式。debug跟下啊。看下为什么hibernate会把HQL翻译这样,同时看下给这个?到底赋的什么值。不知道发生什么,可以debug一步一步调试,否则很难知道是什么问题。既然不报错,查不出结果,那就看下这句SQL直接在数据库中是否能查询出结果,尤其是你给的where条件,你确定在数据库中查不出还是根本就没有。我这里没有你的环境,也不知道你的业务到底是个什么样子,只能根据你字面的意思分析了,具体的你还得自己调试。总之debug下,这样你就知道后台都执行了些什么。
      

  12.   

    我突然想到了,那个方法就是根据主键查询,是要求传递主键值的,所以sql语句里肯定是要有两个值
    你说对不?
    我的那个业务需求用这个get方法是不行的,因为我并不是根据主键查询的
    我重新写个查询就行了