休眠自动增量ID

时间:2010-01-06 07:40:39

标签: java hibernate auto-increment

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

7 个答案:

答案 0 :(得分:141)

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

并在保留时保留null0)。 (null如果您使用Integer / Long包装器

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

似乎 SEQUENCE + 指定序列名称为您工作。

答案 1 :(得分:31)

按如下方式进行: -

@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 (?, ?, ?, ?, ?)

答案 2 :(得分:7)

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

AUTO - 标识列,序列或表,具体取决于基础数据库

TABLE - 包含ID的表

IDENTITY - 标识列

SEQUENCE - 序列

身份证复制 - 身份从其他实体复制

使用表格的示例

@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

答案 3 :(得分:6)

FYI

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

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

这让我得到了同样的错误,说列不能为空,所以我只是删除@NotNull anotation,将属性保留为null,并且它有效!

答案 4 :(得分:4)

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

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

答案 5 :(得分:0)

如果在 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
}

答案 6 :(得分:0)

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