gpt4 book ai didi

java - 如何使用 Hibernate 插入记录正确自动生成主键 ID

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:33 28 4
gpt4 key购买 nike

我有一个 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 |

+----+------------------------+------------+ --------------+

现在,在我的成员(member)注册页面,当我提交注册新成员(member)的请求时,我收到了这个错误信息:

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)

这可能是什么原因造成的?

最佳答案

您应该使用IDENTITY 生成器。 IDENTITY 生成器允许整数和 bigint 列按需自动递增。增量过程非常高效,因为它使用数据库内部轻量级锁定机制,而不是更重量级的事务性粗粒度锁。

    @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

并且不要在插入语句中使用 id,因为它是自动生成的。
请注意,SEQUENCE 对您不起作用,因为 SEQUENCE 不适用于 MySQL

关于java - 如何使用 Hibernate 插入记录正确自动生成主键 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38988757/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com