如何让Hibernate在Oracle上使用SequenceHiLoGenerator for JPA GenerationType.AUTO?

时间:2016-01-16 00:54:08

标签: java mysql oracle hibernate jpa

我有一个id如下所示的表,但是hibernate使用org.hibernate.id.SequenceGenerator而不是GenerationType.AUTO的SequenceHiLoGenerator,如何告诉hibernate使用SequenceHiLoGenerator?

@Id
@SequenceGenerator(name="admin_seq", sequenceName="unique_id")
@GeneratedValue(strategy=GenerationType.AUTO, generator="admin_seq")
private Long id

如果我使用GenerationType.SEQUENCE,hibernate将使用SequenceHiLoGenerator,但我需要使用GenerationType.AUTO来与MySQL兼容。

我尝试过使用@GenericGenerator,它适用于Oracle,但会被MySQL抱怨:org.hibernate.dialect.MySQLDialect不支持序列。

@GenericGenerator(name = "admin_seq", strategy = "org.hibernate.id.SequenceHiLoGenerator",
        parameters = {
                @Parameter(name = "sequence", value = "unique_id"),
                @Parameter(name = "max_lo", value = "50") })
@GeneratedValue(strategy=GenerationType.AUTO, generator="admin_seq")
private Long id

我也尝试通过在hibernate属性中设置hibernate.id.new_generator_mappings = true来使用SequenceStyleGenerator。它也不起作用。

2 个答案:

答案 0 :(得分:0)

即使您已经配置了序列,

strategy = GenerationType.AUTO也应该使用标识列来对抗MySQL。在针对Oracle运行时将使用sequencegenerator,但在针对MySQL运行时会被忽略。

persistence.xml中,您还应将hibernate.dialect属性切换为Oracle方言和MySQL方言的正确值。

答案 1 :(得分:0)

如果设置使用hibernate.id.new_generator_mappings=true的{​​{1}},则可以使用Oracle。我们的项目中有类似的配置,工作正常。

如果您希望实现批量ID检索(每次50次)以加快SequenceStyleGenerator,那么这里的怪癖是您需要将persist/save设置为50并设置序列{{1 50这里只是我选择的一个随机数,如果你有大量的持久性,你可以分配更大的数字。这里最重要的是代码中的allocationSize和数据库中的Increment By MATCH

Oracle sql类似于

allocationSize

JPA实体ID字段如下:

Increment By