Hibernate不尊重MySQL auto_increment主键字段

时间:2009-02-24 16:50:52

标签: java mysql hibernate

我正在努力学习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。似乎没什么用。

我离开了什么?我错过了什么? Hibernate真的很难吗?

(如果有人有另一种Java数据库持久性选项,请建议一个。我正在制作原型,而不是长期的mondo工程项目。)

5 个答案:

答案 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等)。