JPA @GeneratedValue(strategy=GenerationType.AUTO) 在 MySQL 上无法正常工作

7
我有一个实体,应该自动从数据库获取id。我使用的是MySQL,所以我希望注释@GeneratedValue(strategy=GenerationType.AUTO)会在幕后解析为IDENTITY而不是SEQUENCE。然而,当我尝试持久化新实体时,它失败并说找不到hibernate_sequence。这显然使用序列策略而不是identity。
我已将persistence.xml中的方言设置为:org.hibernate.dialect.MySQL5InnoDBDialect Hibernate版本为4.2.0.CR1
所有我读过的资料都说,使用auto作为策略连接到MySQL时应该使用identity。
4个回答

6

如果你正在使用增强型标识符:

 properties.put("hibernate.id.new_generator_mappings", "true");

那么如果使用 SequenceStyleGenerator,由于MySQL不支持序列,它会退回到TABLE生成器。这就是为什么它要寻找“hibernate_sequence”,这是默认序列表名称。

如果您不使用新的生成器,则会使用native生成策略,它将寻找:

public Class getNativeIdentifierGeneratorClass() {
    if ( supportsIdentityColumns() ) {
        return IdentityGenerator.class;
    }
    else if ( supportsSequences() ) {
        return SequenceGenerator.class;
    }
    else {
        return TableHiLoGenerator.class;
    }
}

所以它会从以下选项中选择一个:
  • identity(标识符)
  • sequence(序列)
  • hilo(高低位)
根据您当前的数据库功能而定。
在这种情况下,对于MySQL,它将始终选择IDENTITY

1
@Id
@GeneratedValue(
    strategy= GenerationType.AUTO, 
    generator="native"
)
@GenericGenerator(
    name = "native", 
    strategy = "native"
)

使用此生成器="native",因为数据库不支持序列。


1

AUTO的意思是让JPA实现自行决定(请参阅JPA规范)。 IDENTITY的意思是如果RDBMS支持自动增量功能,则使用它(mySQL支持)。 具体指定(使用IDENTITY),这样就能正常工作。如果您将来移植到不同的JPA实现中,它还有额外的好处,因为不同的" AUTO "逻辑可能会有所不同。


0
你可以在实体bean中使用@GeneratedValue(strategy=GenerationType.IDENTITY)。这在SQL数据库上对我很有效。但是,在调用em.persist(your entity)之后,该实体将无法获得ID。因此,您需要在该实体上调用em.refresh。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接