Hibernate 实体跨表而不是每个表自动增加 id

Posted

技术标签:

【中文标题】Hibernate 实体跨表而不是每个表自动增加 id【英文标题】:Hibernate entities auto-increment id's across tables rather than per table 【发布时间】:2017-06-04 14:09:29 【问题描述】:

目前我有三个表:Company、Group、Person。

这三张表是通过Company和Group是一对多连接的,Group和Person是一对多的。

在所有三个类(Company.java、Group.java、Person.java)中,我都以这种方式编写了自增唯一 ID:

@Id
@Column(name = "id")
@GeneratedValue
private int id;

然后我按以下顺序实例化所有三个类:Company、Group、Person。

将这些对象保存到我的数据库后,我注意到表中的 id 有问题。

显然,不是按照 1、2、3、4 等顺序增加 Company 的 id;它在 1、4、7、10...

在同样的逻辑中,Group 的 id 为 2、5、8、11...

我应该怎么做才能防止@GeneratedValue 计数器在三个不同的表之间共享?我应该使用其他或不同的标签吗?

谢谢。

【问题讨论】:

【参考方案1】:

这可能是因为hibernate为id序列生成了一张表。您正在使用哪个数据库? mysql?或另一个不使用序列的数据库?您可以尝试使用:

 @GeneratedValue(strategy = GenerationType.IDENTITY)

【讨论】:

谢谢!这适用于我的 MySql,后来也适用于 posgresql。 但是如果您必须将您的数据库迁移到 oracle,那么它将无法工作,因为 oracle 不支持身份。在这种情况下你有什么建议会是一个不错的选择> 将生成类型从 AUTO 更改为 IDENTITY 后出现此错误:字段 'id' 没有默认值。

以上是关于Hibernate 实体跨表而不是每个表自动增加 id的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Hibernate 和 postgresql 为一对多关系实现每个表的自动递增 id 字段

我们是不是有任何库可以从表中生成类中的实体字段?

如何删除所有表而不是 Postgresql 中的模式?

Hibernate根据实体类自动创建表

配置hibernate根据实体类自动建表功能

配置hibernate根据实体类自动建表功能