最近幾天幾天作項目用到了Spring Data JPA,確實是個好東西,省了不少力氣。可是因爲剛開始用,也遇到很多頭疼的問題,以下,調用JpaRepository接口的save方法保存一個對象到數據庫中的時候出錯:html
ERROR:java
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'portal.hibernate_sequence' doesn't exist, wqeemysql
對這個問題能夠說是幾經磨難,一直想不通爲什麼會提示sequence不存在,數據庫明明用的是Mysql, 不可能用到序列啊sql
網上百度了很久,答案最多的是說: 數據庫的方言配置出錯,用啥數據庫,配啥方言. 數據庫
想一想確定不對, 個人框架是從別的項目改過來的,配置確定沒問題.框架
糾結了兩天,最後忍不住問項目經理,經理過來瞄了一眼就說: 主鍵自增策略有問題
ide
源碼以下:ui
1 package com.sanss.portal.model; 2 3 import javax.persistence.Entity; 4 import javax.persistence.GeneratedValue; 5 import javax.persistence.GenerationType; 6 import javax.persistence.Id; 7 import javax.persistence.Table; 8 9 @Entity 10 @Table(name="liuliangbaos") 11 public class Liuliangbaos { 12 private int id; 13 private String name; 14 private String zifeimiaosu; 15 private String canpinmiaosu; 16 private String created_at; 17 private String updated_at; 18 private String bianhao; 19 private String shiyongyouxiaoqi; 20 private String rongliang; 21 private String shiyongfanwei; 22 public Liuliangbaos() { 23 super(); 24 // TODO Auto-generated constructor stub 25 } 26 public Liuliangbaos(int id, String name, String zifeimiaosu, String canpinmiaosu, String created_at, 27 String updated_at, String bianhao, String shiyongyouxiaoqi, String rongliang, String shiyongfanwei) { 28 super(); 29 this.id = id; 30 this.name = name; 31 this.zifeimiaosu = zifeimiaosu; 32 this.canpinmiaosu = canpinmiaosu; 33 this.created_at = created_at; 34 this.updated_at = updated_at; 35 this.bianhao = bianhao; 36 this.shiyongyouxiaoqi = shiyongyouxiaoqi; 37 this.rongliang = rongliang; 38 this.shiyongfanwei = shiyongfanwei; 39 } 40 41 @Id 42 @GeneratedValue(strategy=GenerationType.AUTO) 43 public int getId() { 44 return id; 45 } 46 public void setId(int id) { 47 this.id = id; 48 } 49 public String getName() { 50 return name; 51 } 52 public void setName(String name) { 53 this.name = name; 54 } 55 public String getZifeimiaosu() { 56 return zifeimiaosu; 57 } 58 public void setZifeimiaosu(String zifeimiaosu) { 59 this.zifeimiaosu = zifeimiaosu; 60 } 61 public String getCanpinmiaosu() { 62 return canpinmiaosu; 63 } 64 public void setCanpinmiaosu(String canpinmiaosu) { 65 this.canpinmiaosu = canpinmiaosu; 66 } 67 public String getCreated_at() { 68 return created_at; 69 } 70 public void setCreated_at(String created_at) { 71 this.created_at = created_at; 72 } 73 public String getUpdated_at() { 74 return updated_at; 75 } 76 public void setUpdated_at(String updated_at) { 77 this.updated_at = updated_at; 78 } 79 public String getBianhao() { 80 return bianhao; 81 } 82 public void setBianhao(String bianhao) { 83 this.bianhao = bianhao; 84 } 85 public String getShiyongyouxiaoqi() { 86 return shiyongyouxiaoqi; 87 } 88 public void setShiyongyouxiaoqi(String shiyongyouxiaoqi) { 89 this.shiyongyouxiaoqi = shiyongyouxiaoqi; 90 } 91 public String getRongliang() { 92 return rongliang; 93 } 94 public void setRongliang(String rongliang) { 95 this.rongliang = rongliang; 96 } 97 public String getShiyongfanwei() { 98 return shiyongfanwei; 99 } 100 public void setShiyongfanwei(String shiyongfanwei) { 101 this.shiyongfanwei = shiyongfanwei; 102 } 103 104 }
果真,改爲 identity 就OK 了!!! 姜仍是老的辣啊 this
那麼問題來了,mysql數據庫怎麼能夠用SQL的主鍵自增方式 identity 呢??? 爲嘛不能用本身的 auto ???spa
查了一下資料,大體解釋以下:
Hibernate 可以出色地自動生成主鍵。Hibernate/EBJ 3 註釋也能夠爲主鍵的自動生成提供豐富的支持,容許實現各類策略。 其生成規則由@GeneratedValue設定的.這裏的@id和@GeneratedValue都是JPA的標準用法, JPA提供四種標準用法,由@GeneratedValue的源代碼能夠明顯看出. JPA提供的四種標準用法爲TABLE,SEQUENCE,IDENTITY,AUTO. TABLE:使用一個特定的數據庫表格來保存主鍵。 SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。 IDENTITY:主鍵由數據庫自動生成(主要是自動增加型) AUTO:主鍵由程序控制。 在指定主鍵時,若是不指定主鍵生成策略,默認爲AUTO。 @Id 至關於 @Id @GeneratedValue(strategy = GenerationType.AUTO) identity: 使用SQL Server 和 MySQL 的自增字段,這個方法不能放到 Oracle 中,Oracle 不支持自增字段,要設定sequence(MySQL 和 SQL Server 中很經常使用)。 Oracle就要採用sequence了. 同時,也可採用uuid,native等其它策略.(相關用法,上網查詢)
也就是說:
auto: 當數據庫中 不存在 這張表的時候能夠用它建表的時候, 制定自增的方式, 存在的時候插入數據還用它就會出錯了
identity: 使用SQL Server 和 MySQL 的自增字段
總結一下,但願對你們有用!
(PS:感謝經理,大牛就是大牛啊,一眼就解決了我兩天的糾結!)
詳情理解以下:
http://www.cnblogs.com/younggun/archive/2013/05/19/3086659.html