最近在寫網上商城項目時,遇到一個問題:Hibernate在執行save()或者update()方法後,並沒有任何效果,數據庫中沒有任何改動,而且控制台也沒有報任何錯,這讓我很無語……
我在網上查了下,有的人說是主鍵的自增長問題,有的人說是沒有開啟事務,所以無法寫入或更新數據庫,我詳細看了他們的分析,說的都有道理,但是這些解決方法對我都不管用,因為我的主鍵是沒有問題的,事務是由Spring管理的,在其他save操作都可以,都沒有問題。
既然客觀上都沒有問題,於是我把焦點放在了具體要save或update的對像上了,對POJO做了仔細的分析,首先看一下我要save的對像對應數據庫中的表:
/*=============================*/ /* Table: 商品表結構*/ /*=============================*/ create table product ( /* 商品編號,自動增長*/ id int primary key not null auto_increment, /* 商品名稱*/ name varchar(50), /* 商品價格*/ price decimal(8,2), /* 商品圖片*/ pic varchar(300), /* 商品簡單介紹*/ remark longtext, /* 商品詳細介紹*/ xremark longtext, /* 商品生產日期*/ date timestamp default CURRENT_TIMESTAMP, /* 是否為推薦商品,推薦商品才有可能顯示在商城首頁*/ commend bool, /* 是否為有效商品,有效商品才有可能顯示在商城首頁*/ open bool, /* 商品所在的類別編號*/ cid int, constraint cid_FK foreign key(cid) references category(id) );
然後具體的POJO就不貼上來了,就是根據這張表生成的一些字段屬性以及set和get方法。我覺得最有可能出問題的字段應該就是這個時間date,於是我看了下POJO里關於date的代碼:
@Entity public class Product implements java.io.Serializable { // Fields private Timestamp date; //省略其他無關代碼…… @Column(name = "date", nullable = false, length = 19) public Timestamp getDate() { return this.date; } public void setDate(Timestamp date) { this.date = date; } }於是我再一次上網搜索了這個Timestamp,發現問題就出在這,將Timestamp改成java.util.Date即可。然後傳進來一個Date對象,Hibernate會自動轉成Timestamp類型。
這個問題也給我一個啟示:無法執行數據庫操作也有可能是對象本身的問題,要從表的字段和POJO屬性之間來排查。
原文鏈接:http://blog.csdn.net/eson_15/article/details/51383298
以上就是本文的全部內容,希望對大家的學習有所幫助。