从Hibernate 3.6迁移到5.1

时间:2016-06-13 14:52:22

标签: 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 = "applicationEventLog")
private Integer id;

在使用自动增量的MySql上,在Oracle上,它使用了sequenceName所述的序列。所以它是我们在db上创建的序列,而不是hibernate生成的序列。

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

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "applicationEventLog")

它确实使用了所述的序列,但SEQUENCE不适用于MySql。

有没有办法实现旧行为:拥有GenerationType.AUTO但使用@SequenceGenerator中所述名称的序列?

2 个答案:

答案 0 :(得分:1)

AUTO表示将其留给JPA提供商来选择它使用的生成器类型。 SEQUENCE强制它使用SEQUENCE。根据JPA规范。如果你想要一个特定的生成器,那么你应该指定它,而不是依赖于JPA提供者只是发生在你真正想要的同一个

答案 1 :(得分:1)

我们通过更改为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;