com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'portal.hibernate_sequence' doesn't

  最近幾天幾天作項目用到了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

相關文章
相關標籤/搜索