我正在努力学习Hibernate的工作原理,并且我遇到了几乎无法接受的学习曲线。我看不出如何让Hibernate尊重我的对象的auto_increment策略。相反,它使用现有ID覆盖数据库中的条目,从1开始。
我有一个简单的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
。似乎没什么用。
(如果有人有另一种Java数据库持久性选项,请建议一个。我正在制作原型,而不是长期的mondo工程项目。)
答案 0 :(得分:28)
我相信你想要GenerationType.IDENTITY
。 MySql不使用表或序列来生成Id值。
答案 1 :(得分:5)
我是根据接受的答案在评论中写的,但默认情况下不会显示这些内容,因此我会将其重新发布为答案。
我在某个家伙的网站上使用了一个hibernate.cfg.xml文件,它有这个:
<property name="hibernate.hbm2ddl.auto">create</property>
这使得系统每次运行我的应用程序时都会重新创建我的表。评论它解决了这个问题。
关于创建ID的各种方法的另外两个答案是正确的。我原来问题的症状似乎与ID生成有关,但实际原因是配置错误。
答案 2 :(得分:2)
我认为GenerationType.AUTO是正确的&lt; id ...&gt;&lt; generator class =“native”/&gt;&lt; / id&gt;
为特定数据库选择合适的策略。
http://www.hibernate.org/hib_docs/ejb3-api/javax/persistence/GenerationType.html
http://www.hibernate.org/hib_docs/reference/en/html/mapping.html
答案 3 :(得分:1)
我在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;
}
答案 4 :(得分:0)
您可能希望看看: http://hibernatepojoge.sourceforge.net/
它声称只需将其指向数据库即可创建一个完全正常运行的应用程序(spring,hibernate,junit tests等)。