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