Java Oracle as Sequence和MySQL as Identity的Hibernate 5 ID自动生成类型

Java Oracle as Sequence和MySQL as Identity的Hibernate 5 ID自动生成类型,java,mysql,oracle,hibernate,Java,Mysql,Oracle,Hibernate,我们有一个使用Hibernate 5的Java程序,可以使用不同的数据库引擎安装:Oracle、PostgreSQL或SQL Server。现在我们介绍MySql 实体具有生成的值自动标识符 @Id @GeneratedValue(strategy = GenerationType.AUTO) protected Long id; 到目前为止,这一切都很顺利。Oracle和PostgreSQL安装使用HIBERNATE_序列生成id值,SQL Server使用表生成的id(标识) 对于MySQ

我们有一个使用Hibernate 5的Java程序,可以使用不同的数据库引擎安装:Oracle、PostgreSQL或SQL Server。现在我们介绍MySql

实体具有生成的值自动标识符

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
到目前为止,这一切都很顺利。Oracle和PostgreSQL安装使用HIBERNATE_序列生成id值,SQL Server使用表生成的id(标识)

对于MySQL,我们也希望使用表生成的id,但是MySQL上的Hibernate 5 GenerationType.AUTO尝试使用表生成器而不是标识生成器

我发现Vlad Mihalcea使用本机生成器使Hibernate为MySQL选择标识:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
@GenericGenerator(name = "native", strategy = "native")
protected Long id;
这对于MySQL来说很好,但是应用程序不再在Oracle中工作(ORA-02289:sequence不存在)。然后Hibernate在Oracle数据库中搜索名为native的序列

是否有一种解决方案可以使所有其他数据库引擎(Oracle、PostgreSQL和SQL Server)的ID生成保持不变,并使用MySQL的标识


如果不是我能看到的唯一解决方案是在MySQL中实现表ID生成,但似乎是这样。

我几乎有这个问题,但万一有人遇到同样的情况:调用生成器HIBERNATE_序列将使其与Oracle和PostgreSQL向后兼容(SQL Server将继续使用IDENTITY)

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "HIBERNATE_SEQUENCE")
@GenericGenerator(name = "HIBERNATE_SEQUENCE", strategy = "native")
protected Long id;