【发布时间】:2016-12-23 15:31:09
【问题描述】:
我有一个成员实体类,其主键定义为:
@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
注解,那么我总是要在插入之前从数据库表中找出下一个键是什么。
有没有最好的方法来处理这种似乎很常见的情况?
编辑: 按照建议,我使用了 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 保留为空;这就是将其作为包装类型的意义所在。
-
insert语句中不要输入id
标签: java mysql database hibernate