【问题标题】:Hibernate not respecting MySQL auto_increment primary key field休眠不尊重 MySQL auto_increment 主键字段
【发布时间】: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 表。

标签: java mysql hibernate


【解决方案1】:

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

【讨论】:

  • 嗨克林特,感谢您的回复。你说的对。但这最初并没有解决我的问题,因为我在所有事情背后都有一个微妙的、可恶的问题。我将在我原来的问题下发布我的答案。
  • 呃,我改变主意了,我就在这里回答。我在某个家伙的网站上使用了一个 hibernate.cfg.xml 文件,它有这个: create 这使得系统每次都重新创建我的表我运行了我的应用程序。将其注释掉即可解决问题。
  • 伙计,我在 create 上遇到了完全相同的问题,感谢您找到它;p
  • 如果还有人想知道是否要使用 GeneratedValue?我不认为将 ID 注释为 @GeneratedValue 是一个好主意,因为它会对性能产生很大影响。详情请参阅link
【解决方案2】:

我在接受的答案下的评论中写了这个,但默认情况下不显示这些,所以我会重新发布它作为答案。

我正在使用某个家伙的网站上的 hibernate.cfg.xml 文件,它有这个:

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

这使得系统在我每次运行我的应用程序时都重新创建我的表。将其注释掉即可解决问题。

关于创建 ID 的各种方法的其他两个答案是正确的。我最初的问题的症状似乎与 ID 生成有关,但实际原因是配置错误。

【讨论】:

【解决方案3】:

【讨论】:

    【解决方案4】:

    我将以下内容与 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】:

      您可能希望查看: http://hibernatepojoge.sourceforge.net/

      它声称只需将其指向数据库即可创建一个完全正常工作的应用程序(spring、hibernate、junit 测试等)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 2012-03-21
        • 2012-03-15
        • 2011-10-01
        • 2020-09-08
        • 2013-01-03
        • 1970-01-01
        相关资源
        最近更新 更多