我有一个应该自动从数据库中获取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时应该使用身份。
答案 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;
}
}
所以它选择:
取决于您当前的数据库功能。
在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。