休眠不尊重MySQL的auto_increment主键字段
我想了解Hibernate是如何工作的,而且我正在运行一个几乎不可接受的学习曲线。我看不到如何让Hibernate遵守我的对象的auto_increment策略。相反,它是覆盖项与现有的ID数据库,以1休眠不尊重MySQL的auto_increment主键字段
开始我有一个简单Foo
对象,通过这样定义一个MySQL表支持:
CREATE TABLE `Foo` (
`fooId` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`fooId`),
)
我已经证实,插入多用SQL(insert into Foo values();
)与Foo对象做正确的事情。
我的Java类使用注释是这样规定的ID:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="fooId")
private Integer id;
我然后执行一些测试代码,只是实例化对象的Foo并保存到(使用session.save(obj)
)数据库。看起来它使用自己的主键序列,从一开始,而不是看表的关键策略。它覆盖了那里的任何东西。
我已经尝试了@GeneratedValue
位的变体(使用所有可能的策略,删除了括号内的子句)。有人甚至建议完全离开GeneratedValue
。似乎没有任何工作。
我要留下什么东西吗?我错过了什么? Hibernate真的很难吗?
(如果有人有一个替代的Java数据库持久性选项,请建议之一。我提出的原型,而不是持久盟工程项目。)
我相信你想GenerationType.IDENTITY
。 MySql不使用表或序列来生成Id值。
我觉得GenerationType.AUTO是没错的是< ID ... > <生成器类= “本地”/ > </ID >
精选特定数据库的适当策略。
http://www.hibernate.org/hib_docs/ejb3-api/javax/persistence/GenerationType.html
http://www.hibernate.org/hib_docs/reference/en/html/mapping.html
我用AUTO_INCREMENT以下,完美的作品:
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "db_id", unique = true, nullable = false)
public Long getDbId() {
return this.dbId;
}
public void setDbId(Long dbId) {
this.dbId = dbId;
}
我接受的答案下评论写到这,但那些不显示默认情况下,我会重新发布它作为答案。
我使用的是hibernate.cfg.xml文件了一些花花公子的网站,它有这样的:
<property name="hibernate.hbm2ddl.auto">create</property>
这使系统重新创建我的表中的每个我跑我的应用程序的时间。评论它解决了这个问题。
关于创建ID的各种方法的另外两个答案是正确的。我原来的问题症状似乎与身份证生成,但实际的原因是配置错误。
您不妨看看: http://hibernatepojoge.sourceforge.net/
它声称只需将其指向一个数据库,以创建一个完全工作的应用程序(spring,hibernate的,JUnit测试,等)。
+1对于“几乎不可接受的学习曲线” – 2011-02-10 00:17:24
同上。 Hibernate并不像EJB2那样流畅,而且这很大程度上与开发人员拒绝支持内容而不是技术原因有关。 – Zds 2011-09-08 09:16:59
当您指定GenerationType.AUTO时,Hibernate 5.x不再使用IDENTITY。相反,它会为下一个id查找hibernate_sequence表。 – Mohsen 2016-01-11 08:28:06