1. 程式人生 > >hibernate的聯合主鍵

hibernate的聯合主鍵

hibernate 自動建立表時必須有主鍵id,如果沒有可以在該列屬性前加標籤@Id;但主鍵是聯合主鍵時,hibernate會建立兩個實體類:一個為聯合主鍵的實體類,另一個為聯合主鍵和其他非主鍵的屬性的實體類。
今天講的就是聯合主鍵的情況
hibernate如下報錯,說有未知列businessType,就是因為沒有使用聯合主鍵id進行呼叫
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘businessType’ in ‘where clause’
比如表service_quantity_daily_tmp
包含四個欄位 app_id,business_type,sess_day,sess_times, 其中 app_id,business_type,sess_day三個欄位作為聯合主鍵。這時候該如何處理呢?步驟如下:
這裡寫圖片描述


步驟1:hibernate生成實體類
用hibernate自動生成實體類,這時發現表service_quantity_daily_tmp生成了實體類ServiceQuantityDailyTmpId.java和 ServiceQuantityDailyTmp.java 。它們的屬性截圖如下,其中類ServiceQuantityDailyTmpId.java對應於聯合主鍵(appId,businessType,sessDay);
ServiceQuantityDailyTmp.java 中有兩個屬性id和sessTimes,其中id為類ServiceQuantityDailyTmpId的例項物件,id作為表service_quantity_daily_tmp的聯合主鍵使用,比如我要檢視屬性appId,可以用id.appId,其他兩個屬性類似,id.businessType,id.sessDay,同時ServiceQuantityDailyTmp.java中還有個非主鍵屬性sessTimes。
(實體類最好要用hibernate自動生成,因為聯合主鍵的情況要重寫equals和hashCode方法,自己寫很容易出錯)
這裡寫圖片描述

這裡寫圖片描述
步驟2 hibernate.hbm.xml 的配置
在src/main/resources 中新建hibernate.hbm.xml 建立ServiceQuantityDailyTmpId.java 和ServiceQuantityDailyTmp.java 的對應關係,這個對應關係按著步驟1中的介紹進行配置
這裡寫圖片描述

<hibernate-mapping>
 <class name="com.iflytek.xfyun.camp.task.resource.pojo.ServiceQuantityDailyTmp">
  <composite-id name
="id" class="com.iflytek.xfyun.camp.task.resource.pojo.ServiceQuantityDailyTmpId"> <key-property name="appId"></key-property> <key-property name="businessType"></key-property> <key-property name="sessDay"></key-property> </composite-id> <property name="sessTimes" /> </class> </hibernate-mapping>

步驟3: 聯合主鍵在SQL中的使用
由於我們利用不同的資料庫工具,寫的SQL語句可能不一樣,但是對於聯合主鍵的呼叫是一樣的, 比如我們要用到聯合主鍵id中的businessType,我們可以使用id.businessType來進行呼叫,對於非主鍵屬性跟普通語句一樣,例如sessTimes。
這裡寫圖片描述