我有一个Member实体类,其主键定义如下:
@Id
@GeneratedValue
private Long id;
当我启动应用程序时,我使用Hibernate预加载了两个记录到数据库中:
insert into Member (id, name, email, phone_number) values (0, 'John Smith', 'john.smith@mailinator.com', '2125551212')
insert into Member (id, name, email, phone_number) values (1, 'Mary Smith', 'mary.smith@mailinator.com', '2025551212')
现在MySql数据库有两条记录:
select * from Member;
+----+---------------------------+------------+--------------+
| id | email | name | phone_number |
+----+---------------------------+------------+--------------+
| 0 | john.smith@mailinator.com | John Smith | 2125551212 |
| 1 | mary.smith@mailinator.com | Mary Smith | 2025551212 |
+----+---------------------------+------------+--------------+
现在,在我的会员注册页面中,当我提交注册新会员的请求时,我收到了这个错误信息:
Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
我想这是因为自动生成的主键总是以“1”开头,但在数据库中已经有了两条记录,所以主键“1”将重复。
我的问题是,如何在表中存在一些记录时正确创建主键?如果我不使用
@GeneratedValue
如果使用注释,则我总是需要在插入之前从数据库表中找出下一个键。
有没有最佳方式来处理这种看似很普遍的情况?
编辑:
如建议的那样,我使用了策略:
@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)
可能是什么原因导致这种情况发生?