代码之家  ›  专栏  ›  技术社区  ›  Gabe Johnson

Hibernate不尊重mysql auto_increment主键字段

  •  19
  • Gabe Johnson  · 技术社区  · 16 年前

    我正在尝试学习Hibernate是如何工作的,并且我正遇到一个几乎无法接受的学习曲线。我看不到如何让Hibernate遵守对象的自动增量策略。相反,它用现有的ID覆盖数据库中的条目,从1开始。

    我有一个简单的 Foo 对象,由这样定义的mysql表支持:

    CREATE TABLE `Foo` (
      `fooId` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`fooId`),
    )
    

    我已经确认用SQL手工插入多个foo对象( insert into Foo values(); )做正确的事。

    我的Java类使用这样的注释指定了ID:

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="fooId")
    private Integer id;
    

    然后我执行一些测试代码,简单地实例化foo对象并将其保存到数据库(使用 session.save(obj) )它似乎使用自己的主键序列,从一开始,而不查看表的键策略。它覆盖了那里的一切。

    我试过在 @GeneratedValue 位(使用所有可能的策略,不使用附加语句)。有人甚至建议离开 GeneratedValue 完全。似乎什么都没用。

    我是不是漏掉了什么?我错过了什么?冬眠真的这么难吗?

    (如果任何人都有一个可替代的Java数据库持久性选项,请建议一个。我正在制作原型,不是持久的Mondo工程项目。)

    5 回复  |  直到 12 年前
        1
  •  28
  •   Clint    16 年前

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

        2
  •  5
  •   Gabe Johnson    16 年前

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

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

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

    这使得系统可以在每次运行应用程序时重新创建我的表。评论解决了问题。

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

        3
  •  2
  •   cherouvim    16 年前

    我认为generationtype.auto是正确的<id…><generator class=“native”/>gt;/lt;/id>

    为特定数据库选择适当的策略。

    http://www.hibernate.org/hib_docs/ejb3-api/javax/persistence/GenerationType.html

    http://www.hibernate.org/hib_docs/reference/en/html/mapping.html

        4
  •  1
  •   Piko    16 年前

    我使用以下自动增量,非常好地工作:

    @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
  •  0
  •       16 年前

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

    它声称只通过指向一个数据库就可以创建一个完全工作的应用程序(Spring、Hibernate、JUnit测试等)。