zoukankan      html  css  js  c++  java
  • com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'portal.hibernate_sequence' doesn't exist, 谈谈主键自增的方式

      最近几天几天做项目用到了Spring Data JPA,确实是个好东西,省了很多力气。但是由于刚开始用,也遇到不少头疼的问题,如下,调用JpaRepository接口的save方法保存一个对象到数据库中的时候出错:

    ERROR:

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

          对这个问题可以说是几经磨难,一直想不通为何会提示sequence不存在,数据库明明用的是Mysql, 不可能用到序列啊

          网上百度了好久,答案最多的是说: 数据库的方言配置出错,用啥数据库,配啥方言. 

      想想肯定不对, 我的框架是从别的项目改过来的,配置肯定没问题.

      纠结了两天,最后忍不住问项目经理,经理过来瞄了一眼就说: 主键自增策略有问题

        源码如下:

      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 了!!! 姜还是老的辣啊 

    那么问题来了,mysql数据库怎么可以用SQL的主键自增方式 identity 呢??? 为嘛不能用自己的 auto ???

    查了一下资料,大致解释如下:

      

    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

  • 相关阅读:
    两台Mysql数据库数据同步实现
    利用Python读取外部数据文件
    在Python应用中使用MongoDB
    使用python语言操作MongoDB
    windows下Graphviz安装及入门教程
    【Machine Learning】决策树案例:基于python的商品购买能力预测系统
    Python数据可视化-seaborn
    np.tile 函数使用
    Python机器学习库scikit-learn实践
    基于C#net4.5websocket客户端与服务端
  • 原文地址:https://www.cnblogs.com/yangyi9343/p/5807512.html
Copyright © 2011-2022 走看看