我在一个表中插入数据,该表也被一个使用hibernate的java应用程序使用。
我知道Hibernate有一些特殊的策略来为实体生成@Ids。
我的问题是:如果我选择一个随机的id在数据库中手动插入一个新数据,会有什么问题吗?手动,我的意思是使用sql insert语句直接进入数据库。
为了清楚起见,让我举一个例子:
(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)现在我必须插入一个新用户,这次使用的是应用程序。此时,不管实体用户设置了什么@GeneratedValue策略,hibernate是否会在尝试使用数据之前检查@GeneratedValue传递的Id是否可用?
谢谢你,提前谢谢。
发布于 2018-07-23 22:21:25
通常,id应该是表的主键-这意味着数据库本身将检查它是否是唯一的并且不为空。在PostgreSQL中,最好的方法是在id列中使用serial或bigserial数据类型,在Hibernate/JPA @GeneratedValue策略中使用sequence。您可以在API Doc中阅读有关不同类型生成器的更多信息。这将把创建新id的责任转移到数据库,因此Hibernate和插入查询之间的行为将是一致的
发布于 2018-07-23 22:27:38
根据您的评论,您说您正在使用GenerationType.IDENTITY
Here您可以找到更多信息,特别是:
虽然身份排序似乎是分配id的最简单方法,但它们有几个问题。
因此,从理论上讲,如果您已经在数据库中执行了插入操作,表应该知道这一点,但建议使用不同的解决方案(如使用SEQUENCE )。
https://stackoverflow.com/questions/51480833
复制相似问题