程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> hibernate-Hibernate單向one-to-one關聯查詢 - provided id of the wrong type for class

hibernate-Hibernate單向one-to-one關聯查詢 - provided id of the wrong type for class

編輯:編程解疑
Hibernate單向one-to-one關聯查詢 - provided id of the wrong type for class

---------------------Table設定信息-----------------------
Table --- Car

carId -- number -- pk 序列號
brandId -- varchar2 - fk 汽車品牌

Table --- CarBrand

brandId -- varchar2 -- pk 品牌ID
brandName -- varchar2 品牌名稱

----------------------Hbm設定信息---------------------------
Car.hbm

 <id name="carId">
    <generator class="sequence">s_car_id</generator>
 </id>

 <one-to-one name="brand" class="CarBrand.class" />

CarBrand.hbm

 <id name="brandId">
   <generator class="assigned"/>
 </id>

 <property name="brandName" type="java.lang.String" column="brandName"/>

---------------------查詢所有品牌為A的車輛---------------------
Criteria c = session.createCriteria();
c.createAlias(Car.class, "car");
c.createAlias("car.brand","brand");
c.add(Restriction.eq("brand.brandId","A"));'
c.list();

執行過程中產生如下報錯信息
org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.lw.domiane.Car Expected: class java.lang.String , got class java.lang.Long

at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:109)

at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905)

at org.hibernate.impl.SessionImpl.get(SessionImpl.java:842)

at org.hibernate.impl.SessionImpl.get(SessionImpl.java:835)

at com.lw.service.imp.BaseService.findById(BaseService.java:55)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)

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 $Proxy12.findById(Unknown Source)

at com.lw.web.action.CarAction.download()(CarAction.java:51)

以上我出現的狀況,有誰能幫忙解決一下,謝謝!

最佳回答:


看來沒人能回答我的問題,研究了一下,終於解決了,這裡分享給大家。
首先大家可以從我的表的設定看出來,brandId是一個外鍵,關聯到carBrand表裡面的brandId,我現在希望使用one-to-one的映射模式使得Car.class的類中能夠產生一個Brand的對象;
有兩種映射模式,主鍵關聯模式以及唯一外鍵模式
主鍵關聯就是我們正常情況下使用的

 <one-to-one name="brand" class="CarBrand.class" />

這種情況下產生的sql的形式如下:
select * from car c, carBrand cb where c.carId = cb.brandId ;

這就是我使用上面的方式報錯的原因;

唯一外鍵模式,hbm格式如下

<many-to-one name="brand" class="CarBrand.class" unique="true" column="brandId"/>

此模式下產生sql如下
select * from car c, carBrand cb where c.barndId = cb.brandId

將Car.hbm文件中配置修改掉就可以解決這個問題了,希望對大家有幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved