如何使用JPA批注注释MYSQL自动增量字段

问题描述:

直截了当,问题是将对象操作符保存到MySQL DB中。 保存之前,我尝试从这张表中选择它,它的工作原理,连接到数据库也是如此。如何使用JPA批注注释MYSQL自动增量字段

这里是我的操作对象:

@Entity 
public class Operator{ 

    @Id 
    @GeneratedValue 
    private Long id; 

    private String username; 

    private String password; 


    private Integer active; 

    //Getters and setters... 
} 

为了节省我使用JPA EntityManagerpersist方法。

下面是一些日志:

Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?) 
[email protected]: insert into Operator (active,password, username, id) values (0, 'pass', 'user', ** NOT SPECIFIED **) 

我看到它的方式,问题是自动增量配置,但我想不通的地方。

尝试一些技巧我在这里看到: Hibernate not respecting MySQL auto_increment primary key field但没有那工作

如果需要任何其他配置文件,我会向他们提供。

DDL:

CREATE TABLE `operator` ( 
`id` INT(10) NOT NULL AUTO_INCREMENT, 
`first_name` VARCHAR(40) NOT NULL, 
`last_name` VARCHAR(40) NOT NULL, 
`username` VARCHAR(50) NOT NULL, 
`password` VARCHAR(50) NOT NULL, 
`active` INT(1) NOT NULL, 
PRIMARY KEY (`id`) 
) 
+0

你使用的是什么版本的Hibernate? – 2010-11-06 21:19:11

+0

休眠3.2.4 – trivunm 2010-11-06 21:38:48

要使用MySQL AUTO_INCREMENT列,你应该使用IDENTITY策略:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long id; 

这是使用AUTO与MySQL时,你会得到什么:

@Id @GeneratedValue(strategy=GenerationType.AUTO) 
private Long id; 

其中实际上等于

@Id @GeneratedValue 
private Long id; 

换句话说,您的映射应该工作。但是Hibernate应该省略SQL插入语句中的id列,而不是。在某个地方肯定会有一种不匹配。

您是否在Hibernate配置中指定了MySQL方言(可能为MySQL5InnoDBDialectMySQL5Dialect,具体取决于您使用的引擎)?

另外,谁创建了表?你能显示相应的DDL吗?

后续问题:我无法重现您的问题。使用实体和 DDL的代码,Hibernate的生成与MySQL以下(预期)SQL:

insert 
into 
    Operator 
    (active, password, username) 
values 
    (?, ?, ?) 

注意,id列是从上面的语句不存在,符合市场预期。总之,你的代码,表格定义和方言是正确和连贯的,它应该工作。如果它不适合你,也许有些东西是不同步的(做一个干净的构建,仔细检查构建目录等)或其他东西是错误的(检查日志中是否有任何可疑内容)。

关于方言的MySQL5DialectMySQL5InnoDBDialect之间仅区别是,后来生成DDL时添加ENGINE=InnoDB表对象。使用其中一个不会更改生成的SQL。

+0

帕斯卡尔,你是对的,但在我的配置文件中的东西是不正确的。任何其他建议也许,现在我已经把新的信息和配置文件? – trivunm 2010-11-16 22:17:48

+9

@Pascal - 我发现我需要@GeneratedValue(strategy = GenerationType.IDENTITY)来使AUTO_INCREMENT在使用JPA 2/Hibernate 4.0.0.CR2/JBoss AS 7时正常工作。http://bit.ly/ tdNyOJ – 2011-10-26 18:35:24

+4

请注意,对于MySQL MySQL,这是正确的。使用** PostgreSQL **,当您编写'@GeneratedValue(strategy = GenerationType.AUTO)'和'@ GeneratedValue'时,您不会获得'@GeneratedValue(strategy = GenerationType.IDENTITY)'。所以要小心并尽量做到冗长。 – sajjadG 2013-11-08 11:00:43

对于任何读者使用EclipseLink for JPA 2.0,下面是我必须使用的两个注释来让JPA保存数据,其中“MySequenceGenerator”是您想要给生成器的任何名称,“myschema”是数据库中包含序列对象的模式的名称,“mysequence”是数据库中序列对象的名称。

@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="MySequenceGenerator") 
@SequenceGenerator(allocationSize=1, schema="myschema", name="MySequenceGenerator", sequenceName = "mysequence") 

对于使用的EclipseLink(可能还有其他JPA提供者)的,关键是你设置的allocationSize属性匹配数据库中的序列定义的增量值。如果你不这样做,你会得到一个通用的持久性失败,并且浪费大量的时间试图追踪它,就像我一样。下面是帮助我克服这个挑战的参考页:

http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey#Using_Sequence_Objects

而且,给语境,这里我们使用什么:

的Java 7 Glassfish的3.1 的PostgreSQL 9.1 PrimeFaces 3.2/JSF 2.1

另外,出于懒惰的原因,我在Netbeans中用向导从DB,实体控制器和实体JSF生成向导,向导(显然)不知道如何处理sequen基于ce的ID列,所以您必须手动添加这些注释。

使用MySQL,只有这个办法是为我工作:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long id; 

并没有为我工作帕斯卡在他的回答中规定的其他2点的方法。

+0

是的,我在我的问题/答案中提到了这一点。 HTTP://计算器。COM /问题/ 39675714 /架构验证缺失表,休眠序列/ 39675802#39675802 – 2016-09-24 11:29:58

请确保该ID的数据类型是龙,而不是字符串,如果 将字符串,然后@GeneratedValue注释,将无法正常工作和

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
private String id; 

create table VMS_AUDIT_RECORDS (id **varchar(255)** not null auto_increment primary key (id)) 

的 SQL生成需要成为

create table VMS_AUDIT_RECORDS (id **bigint** not null auto_increment primary key (id))