我有一个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。它也不起作用。
答案 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