最近几天几天做项目用到了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. 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 ???

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

  

  1. Hibernate 能够出色地自动生成主键。Hibernate/EBJ 3 注释也可以为主键的自动生成提供丰富的支持,允许实现各种策略。
  2. 其生成规则由@GeneratedValue设定的.这里的@id@GeneratedValue都是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出.
  3. JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
  4. TABLE:使用一个特定的数据库表格来保存主键。
  5. SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
  6. IDENTITY:主键由数据库自动生成(主要是自动增长型)
  7. AUTO:主键由程序控制。
  8. 在指定主键时,如果不指定主键生成策略,默认为AUTO
  9. @Id
  10. 相当于
  11. @Id
  12. @GeneratedValue(strategy = GenerationType.AUTO)
  13.  
  14. identity:
  15. 使用SQL Server MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequenceMySQL SQL Server 中很常用)。
  16. Oracle就要采用sequence了.
  17.  
  18. 同时,也可采用uuid,native等其它策略.(相关用法,上网查询)

也就是说:

auto:        当数据库中  不存在 这张表的时候可以用它建表的时候, 制定自增的方式,  存在的时候插入数据还用它就会出错了

identity:     使用SQL Server 和 MySQL 的自增字段

总结一下,希望对大家有用!

(PS:感谢经理,大牛就是大牛啊,一眼就解决了我两天的纠结!)

详情理解如下:

http://www.cnblogs.com/younggun/archive/2013/05/19/3086659.html

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'portal.hibernate_sequence' doesn't exist, 谈谈主键自增的方式的更多相关文章

  1. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jeewx.weixin_account_user_relation' doesn't exist

    [INFO] Scanning for projects...[INFO] [INFO] ------------------------------------------------------- ...

  2. [jnhs]hibernate只能创建一张/表不创建表com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'kaihu.t_client_info' doesn't exist和org.hibernate.exception.SQLGrammarException: could not execute statement

    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'kaihu.t_client_info' doesn't exist ...

  3. 将windows上面的项目拷贝到Linux环境下报错不能够找到对应的表com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'puyang.ServiceType' doesn't exist

    将一模一样的项目从win迁移到到linux上报错: 一开始还是以为是linux不能识别hql语句,查找资料发现是因为Liunx服务器上mysql是区分大小写的,而本地是不区分的如:代码是这样写的 @E ...

  4. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'easylabdb.userInfo' doesn't exist

    这个问题主要是说,你查找的表不存在,但是,事实上我这个表示存在的,会产生这个问题的原因是,我这个表的大小写拼写方式跟sql语句中的大小写不一样,这时就要设置数据库不区分大小写 找到mysql的配置文件 ...

  5. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'zhongfucheng.user' does

    编写第一个Hibernate程序的时候,就发现出现了错误 Exception in thread "main" org.hibernate.exception.SQLGrammar ...

  6. 【异常】ERROR main:com.cloudera.enterprise.dbutil.SqlFileRunner: Exception while executing ddl scripts. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'ROLES' already exists

    1 详细异常 2019-10-11 10:33:55,865 INFO main:com.cloudera.server.cmf.Main: ============================= ...

  7. 错误:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hdjyproj.t_userinfo' do ...

  8. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: REFERENCES command denied to user 'nali'@'localhost' for table 'dbs'

    按照教程 Install hive on Mac with Homebrew,在 mac 上安装 Hive 时, 最后执行 hive 命令后,出现错误: Exception in thread &qu ...

  9. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: SELECT command denied to user’

    Linux环境 Mysql+Hibernate command denied to user 错误 错误信息 如下: com.mysql.jdbc.exceptions.jdbc4.MySQLSynt ...

随机推荐

  1. WEB前端:浏览器(IE+Chrome+Firefox)常见兼容问题处理--02

    兼容问题目录 8.IE6不支持固定定位 9.IE6下前面元素浮动,后面元素不浮动后他们之间会有间隙 10.IE6下双边距问题 11.IE67下父级有边框,子级有margin的话会不起作用 12.IE6 ...

  2. 一天搞定CSS:定位position--17

    1.定位取值概览 2.相对定位relative <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  3. vue使用Axios做ajax请求

    vue2.0之后,就不再对vue-resource更新,而是推荐使用axios 1. 安装 axios $ npm install axios 或 $ bower install axios 2. 在 ...

  4. Coursera 机器学习笔记(二)

    主要为第三周课程内容:逻辑回归与正则化 逻辑回归(Logistic Regression) 一.逻辑回归模型引入 分类问题是指尝试预测的是结果是否属于某一个类. 维基百科的定义为:根据已知训练区提供的 ...

  5. 邪恶改装:TPYBoard制作廉价WIFI干扰器

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 0X01 引言 想不想搞个WIFI干扰器?网上搜集了一下资料,发现用esp8266可以实现简单的干扰功能,包括断网. ...

  6. react-native学习(RN)--之Window环境下搭建环境配置

    react-native以后会更火的,自从2015年facebook开源了Android 一.安装java 二.安装Android Studio 三.安装react-native需要的Android ...

  7. Spring学习(17)--- 三种装配Bean方式比较

      基于XML配置 基于注解配置 基于Java类配置 Bean定义 <bean   id="..." class="..." /> @Compone ...

  8. .NET 随记

    1. goto 常用于 switch语句中2. 字符串相加用 StringBuilder的Append()方法性能好3. str.Trim(',') 清除字符串后的","4. st ...

  9. LeetCode 206 单链表翻转

    https://leetcode.com/problems/reverse-linked-list/ 思路很简单,分别设置三个结点,之后依次调整结点1和结点2的指向关系. Before: pre -& ...

  10. MongoDB--MapReduce分布统计s

    MapReduce Mapreduce:要操作的目标集合 Map:映射函数(生成键值对序列,作为reduce函数参数) //传入分组的key和需要统计的值 Reduce:统计函数 //格式化返回的参数 ...