【发布时间】:2009-02-24 16:50:52
【问题描述】:
我正在尝试了解 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 工程项目。)
【问题讨论】:
-
+1 表示“几乎无法接受的学习曲线”
-
同上。 Hibernate 不像 EJB2 那样顺利,这在很大程度上与开发人员拒绝支持东西而不是技术原因有关。
-
Hibernate 5.x 在您指定 GenerationType.AUTO 时不再使用 IDENTITY。相反,它会为下一个 id 查找 hibernate_sequence 表。