use*_*911 2 java mysql database hibernate
我有一个Member实体类,其主键定义为:
@Id
@GeneratedValue
private Long id;
Run Code Online (Sandbox Code Playgroud)
我在启动应用程序时使用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')
Run Code Online (Sandbox Code Playgroud)
现在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 |
Run Code Online (Sandbox Code Playgroud)
+ ---- + --------------------------- + ------------ + --- ----------- +
现在,在我的会员注册页面中,当我提交注册新会员的请求时,我收到了以下错误消息:
Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)
我认为这是因为自动生成的密钥始终以'1'开头,但在数据库中,它已经有两条记录,因此主密钥'1'将是重复的.
我的问题是,如果表中有许多现有记录,如何正确创建主键?如果我不使用
@GeneratedValue
Run Code Online (Sandbox Code Playgroud)
注释,然后我总是要在插入之前找出数据库表中的下一个键是什么.
有没有最好的方法来处理这种情况,这似乎很常见?
编辑:正如所建议的,我使用了Stragey:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果表中有两条现有记录,如下所示:
select * from English;
+----+------------+---------+--------+
| id | sentence | source | status |
+----+------------+---------+--------+
| 1 | i love you | unknown | 0 |
| 2 | i like you | unknown | 0 |
+----+------------+---------+--------+
Run Code Online (Sandbox Code Playgroud)
在我向表中注册新记录后,新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)
Run Code Online (Sandbox Code Playgroud)
什么可能导致这个?
你应该使用IDENTITY发电机.该IDENTITY发生器允许一个整数,BIGINT列是自动递增的需求.增量过程非常有效,因为它使用数据库内部轻量级锁定机制,而不是更重量级的事务过程 - 谷物锁定.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Run Code Online (Sandbox Code Playgroud)
并且不要在insert语句中使用id,因为它是自动生成的.
请注意,SEQUENCE不适合您,因为SEQUENCE不适用于MySQL
| 归档时间: |
|
| 查看次数: |
12771 次 |
| 最近记录: |