【发布时间】:2020-03-20 14:35:55
【问题描述】:
我们有一个使用 Hibernate 5 的 Java 程序,可以使用不同的数据库引擎进行安装:Oracle、PostgreSQL 或 SQL Server。现在我们正在介绍MySql。
实体有一个自动生成值标识符。
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
到目前为止,这一切都很好。 Oracle 和 PostgreSQL 安装使用 HIBERNATE_SEQUENCE 序列来生成 id 值,而 SQL Server 使用表生成的 id (IDENTITY)。
对于 MySQL,我们还想使用表生成的 id,但 MySQL 上的 Hibernate 5 GenerationType.AUTO 尝试使用 TABLE 生成器而不是 IDENTITY 生成器。
我发现 Vlad Mihalcea 的 this solution 使用本机生成器使 Hibernate 为 MySQL 选择 IDENTITY:
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
@GenericGenerator(name = "native", strategy = "native")
protected Long id;
这对 MySQL 来说很好,但是应用程序不再在 Oracle 中工作(ORA-02289:序列不存在)。 I think Hibernate 然后在 Oracle DB 中搜索一个名为 native 的序列。
是否有一种解决方案可以使所有其他数据库引擎(Oracle、PostgreSQL 和 SQL Server)的 ID 生成保持相同并为 MySQL 使用 IDENTITY?
如果不是我能看到的唯一解决方案是在 MySQL 中实现 TABLE ID 生成,但似乎not to have a good performance。
【问题讨论】:
标签: java mysql oracle hibernate