我正在使用hibernate的java应用程序使用的表上插入数据。
我知道Hibernate有一些细节策略来为实体生成@Ids
。
我的问题是:如果我选择一个随机ID在数据库中手动插入新数据,我会遇到任何问题。手动是指直接在数据库中使用sql插入语句。
为使自己清楚,让我举个例子:
(1)我有一个实体User
,其当前的最高ID为10;
(2)我必须使用insert语句将一些手动插入直接插入数据库中,例如
INSERT INTO user (id, username) values (11, 'user_11');
INSERT INTO user (id, username) values (12, 'user_12');
(3)现在,我必须使用应用程序来插入一个新用户。此时,无论实体User设置了@GeneratedValue
策略如何,在尝试使用数据之前,休眠状态都会检查@GeneratedValue
传递的ID是否可用吗?
谢谢你。
答案 0 :(得分:1)
通常id
应该是表的主键-这意味着数据库本身将检查它是否唯一并且不为空。在PostgreSQL中,根据您的情况,最好的方法是在serial
列中使用bigserial
或id
数据类型,在Hibernate / JPA @GeneratedValue
策略中使用sequence
。您可以在API Doc中了解有关不同类型的生成器的更多信息。这将把创建新的id
的责任转移到数据库,因此Hibernate和插入查询之间的行为将保持一致
答案 1 :(得分:1)
根据您的评论,您说您正在使用 GenerationType.IDENTITY
Here,您可以找到更多信息,尤其是:
尽管身份排序似乎是最简单的分配方法 一个id,他们有几个问题。 一个原因是,由于ID不为 由数据库分配,直到插入该行,该ID才能为 直到提交后或刷新调用后才在对象中获取。 身份测序也不允许序列预分配,因此 可能需要为插入的每个对象进行选择 造成主要的性能问题,因此通常不会 推荐。
因此,从理论上讲,如果您已经在数据库中完成了插入操作,则表应该知道这一点,但是建议使用其他解决方案(例如,使用 SEQUENCE )