如何使用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 EntityManager
的persist
方法。
下面是一些日志:
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`)
)
要使用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方言(可能为MySQL5InnoDBDialect
或MySQL5Dialect
,具体取决于您使用的引擎)?
另外,谁创建了表?你能显示相应的DDL吗?
后续问题:我无法重现您的问题。使用您实体和您 DDL的代码,Hibernate的生成与MySQL以下(预期)SQL:
insert
into
Operator
(active, password, username)
values
(?, ?, ?)
注意,id
列是从上面的语句不存在,符合市场预期。总之,你的代码,表格定义和方言是正确和连贯的,它应该工作。如果它不适合你,也许有些东西是不同步的(做一个干净的构建,仔细检查构建目录等)或其他东西是错误的(检查日志中是否有任何可疑内容)。
关于方言的MySQL5Dialect
或MySQL5InnoDBDialect
之间仅区别是,后来生成DDL时添加ENGINE=InnoDB
表对象。使用其中一个不会更改生成的SQL。
帕斯卡尔,你是对的,但在我的配置文件中的东西是不正确的。任何其他建议也许,现在我已经把新的信息和配置文件? – trivunm 2010-11-16 22:17:48
@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
请注意,对于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点的方法。
是的,我在我的问题/答案中提到了这一点。 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))
你使用的是什么版本的Hibernate? – 2010-11-06 21:19:11
休眠3.2.4 – trivunm 2010-11-06 21:38:48