2015-01-05 65 views
0

在我的項目我嘗試挽救稱爲產品符合的Hiberante的session.save對象,到現在爲止它總是工作在session.save(對象)一個ClassCastException,但突然我得到這個異常:的Hiberante拋出

Caused by: java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String 
at org.hibernate.type.descriptor.java.StringTypeDescriptor.unwrap(StringTypeDescriptor.java:39) 
at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$1.doBind(VarcharTypeDescriptor.java:64) 
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:90) 
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286) 
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281) 
at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:56) 
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2843) 
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2818) 
at org.hibernate.persister.entity.AbstractEntityPersister$4.bindValues(AbstractEntityPersister.java:3025) 
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3032) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3558) 
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:98) 
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:490) 
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:195) 
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:179) 
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:214) 
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:324) 
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288) 
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194) 
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209) 
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194) 
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:715) 
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:707) 
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:702) 
at erion.db.connection.HibernateQueries.save(HibernateQueries.java:43) 
at erion.db.model.ProductManager.saveProduct(ProductManager.java:25) 
at erion.view.ProductView$NewProductLayout$1.buttonClick(ProductView.java:86) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508) 
... 38 more 

的mappingfile:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated 07.11.2014 11:50:20 by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="erion.db.beens.Product" table="product" catalog="mydb"> 
     <id name="idproduct" type="java.lang.Integer"> 
      <column name="idproduct" /> 
      <generator class="identity" /> 
     </id> 
     <property name="name" type="string"> 
      <column name="name" length="45" /> 
     </property> 
     <property name="price" type="string"> 
      <column name="price" length="45" /> 
     </property> 
     <property name="rateofmwst" type="java.lang.Double"> 
      <column name="rateofmwst" precision="22" scale="0" /> 
     </property> 
     <set name="deliverynoteHasProducts" table="deliverynote_has_product" inverse="true" lazy="false" fetch="select"> 
      <key> 
       <column name="product_idproduct" not-null="true" /> 
      </key> 
      <one-to-many class="erion.db.beens.DeliverynoteHasProduct" /> 
     </set> 
    </class> 
</hibernate-mapping> 

我生成對象通過的Hiberante逆向工程,得到了這個類:

public class Product implements java.io.Serializable { 

    private Integer idproduct; 
    private String name; 
    private Double price; 
    private Double rateofmwst; 
    private Set deliverynoteHasProducts = new HashSet(0); 

    ... 

} 
+0

嘗試宣告價格列雙?在你的模型中,它是你的hbm聲明的字符串中的兩倍。這可能會導致一些問題。 – Beri

回答

2

正如我在評論中提到: 你的POJO模型聲明瞭一個雙PICE屬性。 您的HBM映射將其視爲字符串。

這將在鑄造過程中導致問題。

溫馨提示: - 使用Long而不是整數作爲PrimaryKey - 使用BigDecimal而不是Double來處理price屬性 - 當涉及到精度時,double不是doubleag。

如果這是您的演示applicion,那麼它的確定。但在現實生活中我也去與我的祕訣:)

+0

哦,不,我很愚蠢:D謝謝你的幫助,我會記住你的提示 –

0

這可能是由於您在映射文件中將屬性「price」的類型定義爲字符串的事實,而它在模型類中是Double。

0

價格列被聲明爲列定義字符串。所以當你從請求傳遞一個Double值並試圖持久化它時,它會給你類型轉換異常。嘗試更改產品類或數據庫中的值。