最近在寫網上商城項目時,遇到一個問題:Hibernate在執行save()或者update()方法后,并沒有任何效果,數據庫中沒有任何改動,而且控制臺也沒有報任何錯,這讓我很無語……
我在網上查了下,有的人說是主鍵的自增長問題,有的人說是沒有開啟事務,所以無法寫入或更新數據庫,我詳細看了他們的分析,說的都有道理,但是這些解決方法對我都不管用,因為我的主鍵是沒有問題的,事務是由Spring管理的,在其他save操作都可以,都沒有問題。
既然客觀上都沒有問題,于是我把焦點放在了具體要save或update的對象上了,對POJO做了仔細的分析,首先看一下我要save的對象對應數據庫中的表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/*=============================*/ /* 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的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@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屬性之間來排查。
以上就是本文的全部內容,希望對大家的學習有所幫助。