package card.struts;import global.hibernate.MyBeanFactory;
import history.hibernate.History;import java.util.List;
import java.util.Map;import org.apache.struts2.interceptor.SessionAware;import allDao.CardDao;
import allDao.HistoryDao;
import card.hibernate.Card;import com.opensymphony.xwork2.ActionSupport;public class ChoiseCardAction extends ActionSupport implements SessionAware{
/**
 * 
 */
private static final long serialVersionUID = 1L;
private int cardId;
private CardDao cardDao;
private HistoryDao historyDao;
@SuppressWarnings("rawtypes")
private Map session; @SuppressWarnings("rawtypes")
public Map getSession() {
return session;
} public void setSession(@SuppressWarnings("rawtypes") Map session) {
this.session = session;
}
public int getCardId() {
return cardId;
} public void setCardId(int cardId) {
this.cardId = cardId;
} @SuppressWarnings("unchecked")
public String execute()
{
System.out.println("正在执行choiseCard请求!");
if(this.cardDao==null)
{
this.cardDao=(CardDao)MyBeanFactory.MyGetBean("cardDao");
}
if(this.historyDao==null)
{
this.historyDao=(HistoryDao)MyBeanFactory.MyGetBean("historyDao");
}
Card card=this.cardDao.queryById(this.cardId);
System.out.println("选择的卡号为:"+cardId);
System.out.println("卡里还有的钱:"+card.getBalance());
this.session.put("card",card);
List<History> listOfHistory=this.historyDao.queryByCard(this.cardId);//问题就在这里
System.out.println("此卡共有消费记录条数:"+listOfHistory.size());
this.session.put("listOfHistory", listOfHistory);
return "success";
}
}下面是控制台的输出:
正在执行choiseCard请求!
选择的卡号为:7951
卡里还有的钱:100.0问题是listOfHistory=this.historyDao.queryByCard(this.cardId);中如果我把this.cardId改成7951就能运行通过,但是用this.cardId就会报错:java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.Integer
org.hibernate.type.descriptor.java.IntegerTypeDescriptor.unwrap(IntegerTypeDescriptor.java:36)
org.hibernate.type.descriptor.sql.IntegerTypeDescriptor$1.doBind(IntegerTypeDescriptor.java:57)
org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92)
org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:305)
org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:300)
org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:57)
org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2602)
org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2983)
org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2918)
org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3247)
org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140)
org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:276)
org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1214)
org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:403)
org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:480)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
allDao.HistoryDao$$EnhancerByCGLIB$$ca6aaefe.queryByCard(<generated>)
card.struts.ChoiseCardAction.execute(ChoiseCardAction.java:60)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:142)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:166)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
个人感觉好像是bug,求大侠看一下,哪里有问题?

解决方案 »

  1.   

    queryByCard这个方法可否贴出一下。还有History的实体类贴出来一下。
      

  2.   

    package allDao;import java.util.List;import org.hibernate.Query;import global.hibernate.GenericDao;
    import history.hibernate.History;
    import history.hibernate.IHistoryDao;public class HistoryDao extends GenericDao<History> implements IHistoryDao{
    public HistoryDao()
    {
    super(History.class);
    } @SuppressWarnings("unchecked")
    public List<History> queryByCard(int cardId) {
    // TODO Auto-generated method stub
    Query query=this.sessionFactory.getCurrentSession().createQuery("from History h where h.card=?");
    query.setInteger(0, cardId);
    return query.list();
    }
    }
      

  3.   

    这个方法不错,比我在每个Dao类里面加sessionFactory.openSession()方便多了。
      

  4.   


    刚才工作来的。不好意思query.setInteger(0, cardId)
    改为
    query.setParameter(0, cardId);
    试试。history这个类最后也贴出下。
    好像cardId对应你的数据库字段的类型为float?
      

  5.   

    package history.hibernate;import java.util.Date;public class History {
    private int hId;
    private Date time;
    private int card;
    private String address;
    private int type;
    private float numOfUnit;
    public int gethId() {
    return hId;
    }
    public void sethId(int hId) {
    this.hId = hId;
    }
    public Date getTime() {
    return time;
    }
    public void setTime(Date time) {
    this.time = time;
    }
    public int getCard() {
    return card;
    }
    public void setCard(int card) {
    this.card = card;
    }
    public String getAddress() {
    return address;
    }
    public void setAddress(String address) {
    this.address = address;
    }
    public int getType() {
    return type;
    }
    public void setType(int type) {
    this.type = type;
    }
    public float getNumOfUnit() {
    return numOfUnit;
    }
    public void setNumOfUnit(float numOfUnit) {
    this.numOfUnit = numOfUnit;
    }
    }
      

  6.   

    history.hbm.xml<?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="hbm.xml.Group">
      <class name="history.hibernate.History" table="history">
        <id name="hId" type="int" column="hId">
          <generator class="increment"></generator>
        </id>
        
        <property name="time" type="java.util.Date" not-null="true" column="time"></property>
        <property name="card" type="int" length="11" not-null="true" column="card"></property>
        <property name="address" type="java.lang.String" length="50" not-null="true" column="address"></property>
        <property name="type" type="int" length="11" not-null="true" column="type"></property>
        <property name="numOfUnit" type="int" length="11" not-null="true" column="numOfUnit"></property>    
      </class>
    </hibernate-mapping>
      

  7.   

    用query.setParameter(0,cardId);
    也试过了,还是不行。
      

  8.   


    你正式程序的卡号是多少位有效数字的请问。可能需要把history的cardid属性换为long型。
      

  9.   

    只有4位数   ,而且把Query query=this.sessionFactory.getCurrentSession().createQuery("from History h where h.card=?");
    中的.createQuery改成createSQLQuery("select * from history where card=?");  就能执行通过,但是返回的query.list()怎么都无法转换成List<History>.肯跌啊。
      

  10.   


     java.lang.Float cannot be cast to java.lang.Integerthis.historyDao.queryByCard(this.cardId);   LZ的this.cardId是Float 类型的   请转化为Integer类型后  再试试
      

  11.   

    问题应该不在后面,在前面,this.cardId这个值是怎么设置的,通过输入吗,看看输入的值是否和cardId对应是int
      

  12.   


    这个方法我已经试过了。不行。况且cardId明明就是int型啊,应该用不着转化吧。
    不知道是不是aop的问题。唉!
      

  13.   


    这个cardId是从页面传过来的
    <select name="cardId">
              <%
                List<Card> listOfCard=(List<Card>)session.getAttribute("listOfCard");             
                for(int i=0;i<listOfCard.size();i++)
                {
                    CardType cardtype=cardTypeDao.queryById(((Card)listOfCard.get(i)).getcId());
                    int cId=listOfCard.get(i).getCardId();
                    %><option value=<%=cId %>><%=cardtype.getPrefix() %><%=cId %></option><%
                }            
              %>
    </select>cardId他的值就是下拉列表选择的值,也就是,<option value=""里面的value的值
      

  14.   

       <%
                List<Card> listOfCard=(List<Card>)session.getAttribute("listOfCard");             
                for(int i=0;i<listOfCard.size();i++)
                {
                    CardType cardtype=cardTypeDao.queryById(((Card)listOfCard.get(i)).getcId());
                    int cId=listOfCard.get(i).getCardId();
                    %><option value=<%=cId %>><%=cardtype.getPrefix() %><%=cId %></option><%
                }            
              %>换成
    <option value="7951">aaaaa</option>
    看看,如果不报错,就说明上面那段有问题
      

  15.   

    多谢大家的回答,问题我已经找到了。是aop的问题,原来我是这样写的
    <tx:attributes> 
            <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes> 
    然后改成<tx:attributes> 
            <tx:method name="insert" propagation="REQUIRED"/>
            <tx:method name="delete" propagation="REQUIRED"/>
            <tx:method name="update" propagation="REQUIRED"/>
            <tx:method name="drop*" propagation="REQUIRED"/>
            <tx:method name="*" read-only="true"/>
        </tx:attributes> 
    就没有问题了。。