Hibernate是否检测到id何时被使用



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

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

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

为了使我自己清楚,让我举一个例子:

(1( 我有一个实体CCD_ 2,其当前最高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策略,hibernate是否会在尝试使用数据之前检查@GeneratedValue传递的Id是否可用?

提前谢谢。

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

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

在这里你可以找到更多信息,特别是:

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

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

最新更新