Hibernate是否会检测何时使用ID?

时间:2018-07-23 14:10:00

标签: java hibernate

我正在使用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是否可用吗?

谢谢你。

2 个答案:

答案 0 :(得分:1)

通常id应该是表的主键-这意味着数据库本身将检查它是否唯一并且不为空。在PostgreSQL中,根据您的情况,最好的方法是在serial列中使用bigserialid数据类型,在Hibernate / JPA @GeneratedValue策略中使用sequence。您可以在API Doc中了解有关不同类型的生成器的更多信息。这将把创建新的id的责任转移到数据库,因此Hibernate和插入查询之间的行为将保持一致

答案 1 :(得分:1)

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

Here,您可以找到更多信息,尤其是:

  

尽管身份排序似乎是最简单的分配方法   一个id,他们有几个问题。 一个原因是,由于ID不为   由数据库分配,直到插入该行,该ID才能为   直到提交后或刷新调用后才在对象中获取。   身份测序也不允许序列预分配,因此   可能需要为插入的每个对象进行选择   造成主要的性能问题,因此通常不会   推荐。

因此,从理论上讲,如果您已经在数据库中完成了插入操作,则表应该知道这一点,但是建议使用其他解决方案(例如,使用 SEQUENCE