標籤:import 就會 分析 mil mat sans ack detail 開發
近期寫了一個增刪改查的東東,其中修改功能涉及到時間的比較,這個地方發現了一個問題,這個問題在我們的開發環境不存在,但是經過版本管理員發布int之後就出來了。後來發現這個確實也涉及到jdk版本的問題,但是確實也是個問題。
首先,在資料庫裡定義的該時間欄位類型是date類型,Hibernate裡.hbm.xml檔案中orm映射的是 java.util.Date,javabean裡也是java.util.Date,hbm.xml裡的代碼如下:
<property name="tBedinDate" type="java.util.Date"> <column name="T_BEDIN_DATE" length="7"> <comment>起期</comment> </column> </property> <property name="tEndDate" type="java.util.Date"> <column name="T_END_DATE" length="7"> <comment>止期</comment> </column> </property>
當修改功能進行操作時,從頁面傳入背景資料跟從資料庫裡的查詢出來的資料進行比較,由於這兩個時間欄位是必輸欄位,我直接用了java.util.Date的compareTo函數來進行比較,這個是問題所在,在jdk1.5版本之後的jdk進行編譯,就會出現問題。
// if(objOld.gettEndDate().compareTo(obj.gettEndDate())!=0){// objOld.settEndDate(obj.gettEndDate());// }
後來我分析了問題所在:首先從資料庫裡查詢的這個時間欄位的類型,已經被Hibernate預設轉化為:java.sql.Timestamp類型,而從資料擷取的資料經過在頁面展示之後,傳回來的時間欄位則是正常的javabean裡定義的java.util.Date類型,在使用compareTo進行比較的時候會拋出異常,因為這已經是兩個不同的類型在比較了。
這個問題的解決方案有好幾種吧,可以把Timestamp轉成Date, 也可以把Date轉成Timestamp,然後比較,我用的方法是直接把兩個時間欄位都轉化成固定格式的String,然後進行比較。
1、都轉成String 再比較:
String tEndDate = new SimpleDateFormat("yyyy-MM-dd").format(objOld.gettEndDate()); String tEndDateNew = new SimpleDateFormat("yyyy-MM-dd").format(obj.gettEndDate()); if(!tEndDate.equals(tEndDateNew)){ objOld.settEndDate(obj.gettEndDate()); }
2、Timestamp轉成Date
Timestamp t = new Timestamp(System.currentTimeMillis()); Date d = new Date(t.getTime());
3、Date轉成Timestamp
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");String tsStr = new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss").format(objOld.gettEndDate());
Timestamp ts = Timestamp.valueOf(tsStr);
或者 用new Timestamp((new Date()).getTime()) ,這個還沒有試過。
關於為什麼從資料庫裡查詢的這個時間欄位的類型會被Hibernate預設轉成Timestamp類型,查了不少資料,都沒有能給出讓人信服的理由的,
在查資料的時候,發現了幾篇看著挺不錯的文章,可以學習下:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp區別和總結: http://blog.csdn.net/xiancaieeee/article/details/8099184
JDK 1.4升級至JDK5 JDK6的兩個關鍵問題BigDecimal、java.sql.Date : http://shuwen.iteye.com/blog/1179826
Hibernate映射中 date類型 和 javabean裡的java.util.Date變Timestamp的問題