在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
中所述名称的序列?
答案 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;