Java Hibernate是否检测到正在使用id?

Java Hibernate是否检测到正在使用id?,java,hibernate,Java,Hibernate,我在一个表中插入数据,该表也由使用hibernate的java应用程序使用 我知道Hibernate有一些特定的策略来为实体生成@id 我的问题是:如果我选择一个随机id在数据库中手动插入一个新数据,我会有任何问题吗。我所说的手动是指直接在数据库中使用SQLINSERT语句 让我举一个例子来说明我自己: (1) 我有一个实体用户,当前最高id为10 (2) 我必须使用insert语句将一些手动插入直接插入数据库,例如 INSERT INTO user (id, username) values

我在一个表中插入数据,该表也由使用hibernate的java应用程序使用

我知道Hibernate有一些特定的策略来为实体生成
@id

我的问题是:如果我选择一个随机id在数据库中手动插入一个新数据,我会有任何问题吗。我所说的手动是指直接在数据库中使用SQLINSERT语句

让我举一个例子来说明我自己:

(1) 我有一个实体
用户
,当前最高id为10

(2) 我必须使用insert语句将一些手动插入直接插入数据库,例如

INSERT INTO user (id, username) values (11, 'user_11');
INSERT INTO user (id, username) values (12, 'user_12');
(3) 现在我必须插入一个新用户,这次使用的是应用程序。此时,无论实体用户设置了
@GeneratedValue
策略,hibernate是否会在尝试使用数据之前检查
@GeneratedValue
传递的Id是否可用


提前谢谢。

通常
id
应该是表的主键-这意味着数据库本身将检查它是否唯一且不为空。在PostgreSQL中,最好的方法是在
id
列和Hibernate/JPA
@GeneratedValue
策略中使用
serial
bigserial
数据类型作为
sequence
。您可以在中阅读有关不同类型发电机的更多信息。这将把创建新的
id
的责任转移到数据库中,因此Hibernate和insert query之间的行为将是一致的通常
id
应该是表的主键-这意味着数据库本身将检查它是否唯一且不为空。在PostgreSQL中,最好的方法是在
id
列和Hibernate/JPA
@GeneratedValue
策略中使用
serial
bigserial
数据类型作为
sequence
。您可以在中阅读有关不同类型发电机的更多信息。这将把创建新的
id
的责任转移到数据库中,因此Hibernate和insert query的行为将保持一致

根据您的评论,您说您正在使用GenerationType.IDENTITY

您可以找到更多信息,特别是:

虽然身份排序似乎是最容易分配的方法 一个id,他们有几个问题一个是,因为id不是 由数据库分配,直到插入该行为止,无法删除id 在提交或刷新调用之前在对象中获取。 身份排序也不允许序列预分配,因此 可能需要为插入的每个对象进行选择 导致重大性能问题,因此通常不会 推荐的


因此,如果您已经在数据库中完成了插入,表应该知道这一点,但它建议了不同的解决方案(例如使用序列

根据您的评论,您说您正在使用GenerationType.IDENTITY

您可以找到更多信息,特别是:

虽然身份排序似乎是最容易分配的方法 一个id,他们有几个问题一个是,因为id不是 由数据库分配,直到插入该行为止,无法删除id 在提交或刷新调用之前在对象中获取。 身份排序也不允许序列预分配,因此 可能需要为插入的每个对象进行选择 导致重大性能问题,因此通常不会 推荐的


因此,如果您已经在数据库中完成了插入操作,表应该知道这一点,但它建议了不同的解决方案(例如使用序列

您使用的是什么数据库?@Leviand,PostgreSQL。您说您有
@GeneratedValue
注释,然后,您是否在postgres中的表中使用
SERIAL
生成器?@Leviand,我使用的当前策略是@GeneratedValue(strategy=GenerationType.IDENTITY)。我认为hibernate在本例中使用hi/lo策略来分配一系列ID。您使用的是什么数据库?@Leviand,PostgreSQL。您说您有一个
@GeneratedValue
注释,然后您是否在postgres中的表中使用
串行
生成器?@Leviand,我当前使用的策略是@GeneratedValue(strategy=GenerationType.IDENTITY)。我认为hibernate在本例中使用hi/lo策略来分配一系列ID。