hibernate 主键自增策略

来源:互联网 发布:linux redis 启动 编辑:程序博客网 时间:2024/05/16 06:11

ERROR:

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

   主键自增策略有问题

    源码如下:

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 的自增字段

详情理解如下:

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

原创粉丝点击