我有一个实体,它应该自动从数据库中获取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。