Mysql GenerationType.AUTO和#x2B的不同行为@从Hibernate 3.6迁移到5.1时的SequenceGenerator

Mysql GenerationType.AUTO和#x2B的不同行为@从Hibernate 3.6迁移到5.1时的SequenceGenerator,mysql,oracle,hibernate,jpa,Mysql,Oracle,Hibernate,Jpa,在Hibernate 3.6中,我们在MySql和Oracle上都有一个工作代码: @Id @Column(name = "id", nullable = false) @SequenceGenerator(name = "applicationEventLog", sequenceName = "S_APPLICATION_EVENT_LOG") @GeneratedValue(strategy = GenerationType.AUTO, generator = "applicationEv

在Hibernate 3.6中,我们在MySql和Oracle上都有一个工作代码:

@Id
@Column(name = "id", nullable = false)
@SequenceGenerator(name = "applicationEventLog", sequenceName = "S_APPLICATION_EVENT_LOG")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "applicationEventLog")
private Integer id;
在MySql上使用autoincrement,在Oracle上使用的是
sequenceName
中所述的序列。所以这是我们在db上创建的序列,而不是hibernate生成的序列

将hibernate升级到5.1后,它不再使用
@SequenceGenerator
中所述的序列,而是使用
hibernate\u序列
,ID与现有序列冲突。如果我将GenerationType更改为SEQUENCE:

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "applicationEventLog")
它确实使用声明的序列,但序列不适用于MySql


是否有一种方法可以实现旧的行为:拥有
GenerationType.AUTO
,但使用带有
@SequenceGenerator
中所述名称的序列?

AUTO
意味着让JPA提供商选择它使用的生成器类型<代码>序列强制它使用
序列
。根据JPA规范。如果您想要一个特定的生成器,那么您应该指定它,而不是依赖JPA提供程序在您真正想要的同一个生成器上运行

我们通过更改为hibernate的
@GenericGenerator
而不是
@SequenceGenerator
解决了这个问题:

@Id
@Column(name = "id", nullable = false)
@GenericGenerator(name = "applicationEventLog", strategy = "native", parameters = {
        @Parameter(name = SequenceStyleGenerator.SEQUENCE_PARAM, value = "S_APPLICATION_EVENT_LOG"),
})
@GeneratedValue(generator = "applicationEventLog")
private Integer id;

通过将hibernate.id.new_generator_mappings属性设置为false,可以恢复到旧的行为,例如在Spring中指定以下内容:false。当不同的db引擎使用不同的策略时,在Hibernate 5+I中,此属性默认为true
AUTO
在mysql上使用autoincrement,在oracle上使用sequence,这没关系,我只需要一种方法告诉它使用指定的序列。就像在Hibernate 3中一样。这就是为什么有orm.xml,所以每个数据存储都有一个。。因此,MySQL orm.xml将使用IDENTITY,Oracle orm.xml将使用SEQUENCE等。使用一些JPA供应商硬编码的内部功能基本上是不可移植的;唯一真正可移植的方法是使用orm.xml路由。