做SSH網上商城項目的時候,遇到一個網上付款的問題。在已有訂單情況下,對該訂單進行付款,會提示已經付過款的訂單無法繼續付款。問題在於,我還沒有對該訂單付過款。寥寥幾筆,做個小記錄。問題截圖如下:
在正常情況下,訂單編號並不是類似從1開始遞增的,所以我修改訂單編號oid字段類型爲varchar,取消自增長,值爲幾位字母和數字的組合。修改數據庫,就必須要修改Order實體中oid屬性類型爲String,重新生成getters和setters,其他與此有關聯的也要進行相應的修改。
如果不修改Order實體的映射文件,提交訂單的時候還是要報錯的。報錯信息如下:
打開Order.hbm.xml文件,將
<generator class="native"/>
改爲:
<generator class="assigned"/>
OK,遇到問題,好好珍惜,積極解決。
映射文件中,id元素中的generator用來爲該持久化類的實例生成唯一的標識,hibernate提供了很多內置的實現。
Increment:由hibernate自動遞增生成標識符,用於爲long, short或者int類型生成唯一標識。如DB2、SQL Server、MySQL 中的主鍵生成機制。 這種方式可能產生的問題是:不能在集羣下使用。
identity :由底層數據庫生成標識符(自動增長),返回的標識符是 long, short 或者int類型的。
sequence :根據底層數據庫序列生成標識符,返回的標識符 是long, short或者 int類型的。如Oralce中的Sequence。
hilo :使用一個高/低位算法來高效的生成long, short 或者int類型的標識符,需要額外的數據庫表或字段提供高位值來源。
uuid.hex :用一個128-bit的UUID算法生成32位字符串類型的標識符。
uuid.string:與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16),不能應用在PostgreSQL數據庫中。
native :根據底層數據庫的能力選擇identity, sequence 或者hilo中的一個。
assigned :主鍵由外部程序負責生成,讓應用程序在save()之前爲對象分配一個標識符。
foreign :使用另外一個相關聯的對象的標識符。和聯合一起使用。