JPA @GeneratedValue(strategy = GenerationType.AUTO)不适用于MySQL

时间:2014-09-04 15:05:59

标签: java mysql hibernate java-ee jpa

我有一个应该自动从数据库中获取id的实体。我使用MySQL所以我希望注释@GeneratedValue(strategy=GenerationType.AUTO)将在幕后解析IDENTITY而不是SEQUENCE。但是,当我尝试持久保存新实体时,它无法说明找不到hibernate_sequence。它显然使用序列策略而不是身份。

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

Hibernate版本4.2.0.CR1

我读到的所有来源都表示,在使用auto as strategy连接到MySQL时应该使用身份。

4 个答案:

答案 0 :(得分:6)

如果您使用的是增强型标识符:

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

then the SequenceStyleGenerator is used,因为MySQL不支持序列it will fall-back to TABLE generator。这就是为什么它会查找" hibernate_sequence",这是默认的序列表名称。

如果你不使用新的发电机,那么" native"使用生成策略,它将寻找:

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

所以它选择:

  • 身份
  • 序列
  • hilo

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

在MySQL的情况下,它总是选择身份。有关详细信息,请check out this article

答案 1 :(得分:1)

AUTO意味着将其留给JPA实现(参见JPA规范)。 IDENTITY意味着如果RDBMS支持它,则使用自动增量功能(mySQL确实如此)。 具体(使用IDENTITY),它会工作。如果您转移到具有不同逻辑的不同JPA实现,那么这会带来更多好处" AUTO"

答案 2 :(得分:1)

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

使用此generator =“native” 因为数据库不支持序列

答案 3 :(得分:0)

您可以在实体bean中使用@GeneratedValue(strategy = GenerationType.IDENTITY)。 它在sql数据库上对我有用。 但是,在调用em.persist(您的实体)后,实体将无法获取该ID。所以你需要在该实体上调用em.refresh。