我们有一个使用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。
我几乎在问题中遇到了这个问题,但是如果有人陷入同样的情况:调用生成器HIBERNATE_SEQUENCE将使其与Oracle和PostgreSQL向后兼容(SQL Server将继续使用IDENTITY)。
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "HIBERNATE_SEQUENCE")
@GenericGenerator(name = "HIBERNATE_SEQUENCE", strategy = "native")
protected Long id;