我有其主键被定义为会员实体类:如何自动正确生成主键ID使用Hibernate插入记录
@Id
@GeneratedValue
private Long id;
我预先加载两个记录与Hibernate的数据库,当我启动应用程序:
insert into Member (id, name, email, phone_number) values (0, 'John Smith', '[email protected]', '2125551212')
insert into Member (id, name, email, phone_number) values (1, 'Mary Smith', '[email protected]', '2025551212')
现在MySQL数据库有两个记录:
select * from Member;
+----+---------------------------+------------+--------------+
| id | email | name | phone_number |
+----+---------------------------+------------+--------------+
| 0 | [email protected] | John Smith | 2125551212 |
| 1 | [email protected] | Mary Smith | 2025551212 |
+ ---- + ------ --------------------- + ------------ + -------------- +
现在,在我的会员注册页面,当我提交申请注册一个新成员,我收到此错误信息:
Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
我想,这是因为自动生成的密钥始终开头“ 1',但在数据库中,它已经有两个记录,所以主键'1'将会重复。
我的问题是,如何正确创建主键,给定表中的多个现有记录?如果我不使用
@GeneratedValue
注释,那么我总是必须在插入之前找出数据库表中的下一个关键点。
有没有最好的方法来处理这种情况,这似乎很常见?
编辑: 至于建议,我用了Stragey:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
什么奇怪的是,如果在表如下两个现有的记录:
select * from English;
+----+------------+---------+--------+
| id | sentence | source | status |
+----+------------+---------+--------+
| 1 | i love you | unknown | 0 |
| 2 | i like you | unknown | 0 |
+----+------------+---------+--------+
我注册后新的记录到表中,新ID以4开头,不是3,如下所示。
select * from English;
+----+----------------+---------+--------+
| id | sentence | source | status |
+----+----------------+---------+--------+
| 1 | i love you | unknown | 0 |
| 2 | i like you | unknown | 0 |
| 4 | I have a book. | Unknown | 0 |
+----+----------------+---------+--------+
3 rows in set (0.00 sec)
什么可能导致这种情况?
您需要提供表格模式和您用于保存的代码。一般情况下,你只是*不做任何事情*并在保存之前将ID保留为空;这是将它作为包装类型的一点。 – chrylis
不要在插入语句中输入ID – Jens