JPA SequenceGenerator 和 GeneratedValue:名称/生成器属性仅每个类唯一?

Posted

技术标签:

【中文标题】JPA SequenceGenerator 和 GeneratedValue:名称/生成器属性仅每个类唯一?【英文标题】:JPA SequenceGenerator and GeneratedValue: name / generator property unique only per class? 【发布时间】:2013-01-23 14:57:51 【问题描述】:

我使用 JPA + OpenJPA 和 PostgreSQL 作为后端 RDBMS。我的表的主键通常由 SERIAL / BIGSERIAL 列组成。因此 PostgreSQL 会自动为新条目生成 ID (strategy=GenerationType.IDENTITY)。

ID属性的注解如下:

@Id
@SequenceGenerator(name="myseq",sequenceName="foobartable_fooid_seq")
@GeneratedValue(generator="myseq",strategy=GenerationType.IDENTITY)

我的问题是:我可以将此注释块复制并粘贴到多个实体,同时只修改sequenceName 值吗? sequenceName 因表而异。但是可以将所有实体的 SequenceGenerator 命名为myseq 或类似的名称吗?还是必须为每个实体的 SequenceGenerator 指定一个唯一的生成器名称?那么每个 SequenceGenerator 名称在持久化单元中必须是唯一的?

在数据库中使用与 sequenceName 相同的值可能是个好主意吗?所以我会写类似的东西

@Id
@SequenceGenerator(name="foobartable_fooid_seq",sequenceName="foobartable_fooid_seq")
@GeneratedValue(generator="foobartable_fooid_seq",strategy=GenerationType.IDENTITY)

关于如何命名 SequenceGenerators 有什么建议吗?

非常感谢您的任何建议!

你的, 斯鲁布先生

【问题讨论】:

首先,如果你使用序列生成器,你就没有使用 IDENTITY 策略(这将包括使用像 mysql 那样的自动增量列)。剩下的,你为什么不直接去做,看看会发生什么?或者您也可以阅读 SequenceGenerator 的 javadoc,它说:生成器名称的范围对于持久性单元是全局的(跨所有生成器类型). 【参考方案1】:

从Javadoc 到SequenceGenerator,重点是我的:

定义一个主键生成器,当 生成器元素是为 GeneratedValue 注释指定的。一种 序列生成器可以在实体类或 主键字段或属性。 生成器名称的范围是 全局到持久化单元(跨所有生成器类型)。

因此,您需要为持久性单元中定义的每个序列使用唯一名称。在切线上,您的 GeneratedValue 策略应该是 SEQUENCE,正如上面评论中指出的那样。

【讨论】:

非常感谢您的快速回复!使用数据库中也使用的相同名称作为序列是否有任何缺点,意思是 name 等于 sequenceName 关于策略:PostgreSQL 为 SERIAL 类型的列创建一个隐式序列。这是 Postgres 对 MySQL 的 auto_increment 的有点奇怪的挂件。我认为IDENTITY 是正确的,因为有几个页面/示例以这种方式使用 Postgres 的特殊自动增量方式。 我看不出使用与您在数据库中定义的名称相同的名称有任何缺点,因为在 PostgreSQL 中序列名称必须是不同的。如果有的话,它可以简化您的生活。

以上是关于JPA SequenceGenerator 和 GeneratedValue:名称/生成器属性仅每个类唯一?的主要内容,如果未能解决你的问题,请参考以下文章

markdown JPA - SequenceGenerator

hibernate 注解之 SequenceGenerator

JPA主键生成策略

Spring JPA 主键

JPA 或 Hibernate 生成(非主键)列值,不是从 1 开始

Java Spring JPA Hibernate没有更新列