【问题标题】:Hibernate Auto Increment ID休眠自动增量 ID
【发布时间】:2011-01-01 23:06:41
【问题描述】:

我有一个使用带有注释的休眠的 j2ee 应用程序。如何注释我的 pojo 类中的 Id 字段以将其设置为自动增量或自动生成。并且在添加 bean 时,我是否将该字段留在我的 bean 中?

【问题讨论】:

    标签: java hibernate auto-increment


    【解决方案1】:
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    

    你在坚持的时候留下null (0)。 (null 如果你使用 Integer / Long 包装器)

    在某些情况下,AUTO 策略被解析为SEQUENCE 而不是IDENTITYTABLE,因此您可能需要手动将其设置为IDENTITYTABLE(取决于底层数据库)。

    看来SEQUENCE + 指定序列名称对你有用。

    【讨论】:

    • 我的 id 是字符串类型。我将如何设置它。因为我得到这个错误。原因:javax.el.E​​LException: org.hibernate.exception.SQLGrammarException: could not get next sequence value
    • autoincrement 表示它是一个递增的数字。字符串不能递增。使列 int
    • 你没有说你的数据库是什么。尝试将其设置为 IDENTITY,而不是 AUTO。
    • 对于 Oracle,SEQUENCE 是最接近自动增量的东西。除非您让 Hibernate 生成您的模式,否则您必须提前创建序列。如果您认为您可能在某个时候支持多个数据库,请使用 TABLE。
    • 不要使用identity,Oracle不支持identity,它支持sequence。
    【解决方案2】:

    按如下方式进行:-

    @Id
    @GenericGenerator(name="kaugen" , strategy="increment")
    @GeneratedValue(generator="kaugen")
    @Column(name="proj_id")
      public Integer getId() {
        return id;
     }
    

    您可以使用任意名称代替 kaugen。 效果很好,我可以在控制台上看到以下查询

    Hibernate: select max(proj_id) from javaproj
    Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)
    

    【讨论】:

    • 这个对我有用。但它不允许我设置 ID 值。我尝试使用整数或 int 设置 ID,但它随时使用 max。我该怎么办?
    • 使用@GenericGenerator(name="incrementId",strategy="assigned") @GeneratedValue(generator="incrementId")。它可以让你自己设置id。但是如果你没有通过id 那么它将是 0.
    • @Kaushik Lele strategy="increment" hibernate 内置增量策略吗?它属于这些 SEQUENCE,IDENTITY,AUTO,TABLE 中的哪一个?
    • 表中有7亿条记录怎么样?我认为这可能是没有索引的问题
    【解决方案3】:

    仅供参考

    使用 netbeans 来自数据库的新实体类mysql *auto_increment* 列,为您创建一个带有以下注释的属性:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    @NotNull
    private Integer id;
    

    这让我遇到了同样的错误,说该列不能为空,所以我只是删除了 @NotNull 注释,使属性为空,它可以工作!

    【讨论】:

      【解决方案4】:

      Hibernate 定义了五种标识符生成策略:

      AUTO - 标识列、序列或表,具体取决于底层数据库

      TABLE - 保存 id 的表

      IDENTITY - 身份列

      序列 - 序列

      身份副本 – 身份是从另一个实体复制而来的

      使用表格的示例

      @Id
      @GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator")
      @TableGenerator(name="employee_generator", 
                      table="pk_table", 
                      pkColumnName="name", 
                      valueColumnName="value",                            
                      allocationSize=100) 
      @Column(name="employee_id")
      private Long employeeId;
      

      更多详情,请查看link

      【讨论】:

        【解决方案5】:

        如果您有一个想要自动递增的数字列,则可以选择直接设置columnDefinition。这样做的好处是,即使在没有休眠的情况下使用模式也会自动生成值。这可能会使您的代码特定于数据库:

        import javax.persistence.Column;
        @Column(columnDefinition = "serial") // postgresql
        

        【讨论】:

        • MySQL 是 @Column(columnDefinition = "integer auto_increment")
        【解决方案6】:

        PK 类型为 Serial 时,如果有人在此 SO 问题中搜索 Informix 表的策略时遇到问题。

        我发现这是可行的……作为一个例子。

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name = "special_serial_pk")
        private Integer special_serial_pk;
        

        为此,请确保在执行 session.SaveOrUpdate 时传递 special_serial_pk NULL 列的值。

        在我的情况下,我使用 JSON 执行 HTML POST 像这样...

        {
        "special_serial_pk": null, //<-- Field to be incremented
        "specialcolumn1": 1,
        "specialcolumn2": "I love to code",
        "specialcolumn3": true
        }
        

        【讨论】:

          【解决方案7】:

          使用带有 mysql auto_increment 列的数据库中的 netbeans 新实体类,为您创建一个具有以下 hibernate.hbm.xml 的属性: id 是自动递增的

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-25
            • 2016-09-01
            • 1970-01-01
            • 2015-06-08
            • 2014-01-27
            • 1970-01-01
            相关资源
            最近更新 更多