Hibernate自动增量ID

99

我有一个使用注解的Hibernate J2EE应用程序。如何在我的POJO类中注释Id字段以将其设置为自动增量或自动生成?在添加bean时,我是否将该字段保留为空?

7个回答

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

在持久化时,如果您使用的是Integer / Long包装器,则将其设置为null0)。否则,将其留空。

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

看起来您通过SEQUENCE + 指定序列名称的方式解决了问题。


4
自增(autoincrement)指的是递增的数字。字符串无法递增。将该列更改为整数类型。 - Bozho
1
你没有说明你的数据库是什么。尝试将其设置为IDENTITY,而不是AUTO。 - Bozho
2
对于Oracle来说,SEQUENCE是最接近自增的东西。除非您让Hibernate生成模式,否则必须提前创建序列。如果您认为可能在某个时候支持多个数据库,请使用TABLE。 - Brian Deterling
2
不要使用 identity,Oracle 不支持 identity,它支持 sequence。 - JuanZe
@Bozho 有没有一种策略可以为添加的对象提供下一个可用的ID?我的意思是,如果我从具有ID 5的表中删除最后一个对象,新添加的元素是否会获得ID 5?我已经使用了几乎所有的策略,但它总是给出6 ID。有没有办法让它发生? - आनंद
显示剩余5条评论

35

按照以下步骤进行:

@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,但它总是使用最大值。我该怎么办? - desudesudesu
使用@GenericGenerator(name="incrementId",strategy="assigned")和@GeneratedValue(generator="incrementId")注解,可以让你自己设置ID。但是如果你没有传递ID,则默认为0。 - Ravi Kant
@Kaushik Lele 策略="increment" 是 Hibernate 内置的增量策略吗?它属于 SEQUENCE、IDENTITY、AUTO、TABLE 中的哪一个? - Nagappa L M
表中有7亿条记录怎么样?我认为如果没有索引,这可能是个问题。 - user2171669

13

顺便提一下

使用 netbeans 中的 New Entity Classes from Database 功能,针对 mysql 中的 *auto_increment* 列,会为你创建一个带有以下注解的属性:

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

我遇到了相同的错误,提示该列不能为空。因此,我简单地删除了@NotNull注释,将属性留空,这样就可以解决问题了!


10

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

AUTO - 根据底层数据库,使用identity列、序列或表

TABLE - 存储ID的表

IDENTITY - identity列

SEQUENCE - 序列

identity copy – 从另一个实体复制identity

示例使用Table

@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;

了解更多详情,请查看链接


6
如果您有一个想要自动递增的数字列,直接设置columnDefinition可能是一个选项。这样做的好处是,即使在没有使用Hibernate的情况下,模式也会自动生成该值。但这可能会使您的代码与特定的数据库相关联。
import javax.persistence.Column;
@Column(columnDefinition = "serial") // PostgreSQL
@Column(columnDefinition = "integer auto_increment") // MySql

MySQL 是 @Column(columnDefinition = "integer auto_increment")。 - yeralin
1
Postgress的columnDefinition = "serial" - Roberto Rodriguez

1
如果有人在搜索Informix表中主键类型为Serial的策略时“碰巧”遇到了这个 SO 问题,我发现以下方法可行……作为示例。
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

为了使此方法可行,请确保在执行session.SaveOrUpdate时,将列special_serial_pk的值传递为NULL

在我的情况下,我使用类似以下方式的HTML POSTJSON...

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

0

使用NetBeans从MySQL数据库创建新实体类时,如果有一个auto_increment列,它会为你创建一个带有以下hibernate.hbm.xml的属性: id是自动增量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接