2009-02-24 49 views
18

我想了解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数据库持久性选项,请建议之一。我提出的原型,而不是持久盟工程项目。)

+9

+1对于“几乎不可接受的学习曲线” – 2011-02-10 00:17:24

+0

同上。 Hibernate并不像EJB2那样流畅,而且这很大程度上与开发人员拒绝支持内容而不是技术原因有关。 – Zds 2011-09-08 09:16:59

+0

当您指定GenerationType.AUTO时,Hibernate 5.x不再使用IDENTITY。相反,它会为下一个id查找hibernate_sequence表。 – Mohsen 2016-01-11 08:28:06

回答

28

我相信你想GenerationType.IDENTITY。 MySql不使用表或序列来生成Id值。

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; 
} 
5

我接受的答案下评论写到这,但那些不显示默认情况下,我会重新发布它作为答案。

我使用的是hibernate.cfg.xml文件了一些花花公子的网站,它有这样的:

<property name="hibernate.hbm2ddl.auto">create</property> 

这使系统重新创建我的表中的每个我跑我的应用程序的时间。评论它解决了这个问题。

关于创建ID的各种方法的另外两个答案是正确的。我原来的问题症状似乎与身份证生成,但实际的原因是配置错误。

0

您不妨看看: http://hibernatepojoge.sourceforge.net/

它声称只需将其指向一个数据库,以创建一个完全工作的应用程序(spring,hibernate的,JUnit测试,等)。