JPA@GeneratedValue(策略=GenerationType.AUTO)在MySQL上不起作用



我有一个实体,它应该自动从数据库中获取id。我使用MySQL,所以我希望在后台注释@GeneratedValue(strategy=GenerationType.AUTO)将解析为IDENTITY,而不是SEQUENCE。然而,当我尝试持久化一个新实体时,它失败了,说明hibernate_sequence没有找到。它显然使用了序列策略而不是恒等式。

我已将persistence.xml中的方言设置为:org.hibernate.dialect.MySQL5InnoDBDialect

休眠版本4.2.0.CR1

我读到的所有消息来源都说,当使用auto作为策略连接到MySQL时,应该使用身份。

如果您正在使用增强的标识符:

 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;
    }
}

因此,它选择:

  • 身份
  • 序列
  • 希洛

这取决于您当前的数据库功能。

在这种情况下,对于MySQL,它将始终选择IDENTITY

AUTO表示由JPA实现决定(请参阅JPA规范)。IDENTITY意味着如果RDBMS支持,就使用自动增量功能(mySQL支持)。具体一点(使用IDENTITY),它就会起作用。如果您转移到具有不同"AUTO"逻辑的不同JPA实现,这将带来更多好处

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

使用此生成器="本机"因为数据库不支持序列

您可以在实体bean中使用@GeneratedValue(策略=GenerationType.IDENTITY)。它在sql数据库上对我有效。但是,在您调用em.persist(您的实体)之后,实体将不会获得该ID。因此,您需要对该实体调用em.refresh。

最新更新