休眠自动递增ID


85

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

Answers:


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

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

在某些情况下,该AUTO策略被解析为SEQUENCEtoIDENTITY或to TABLE,因此您可能需要手动将其设置为IDENTITYor TABLE(取决于基础数据库)。

似乎SEQUENCE+指定序列名称对您有用。


我的ID是字符串类型。我将如何设置它。因为我得到这个错误。由以下原因引起:javax.el.E​​LException:org.hibernate.exception.SQLGrammarException:无法获取下一个序列值
cedric 2010年

4
自动递增意味着它是一个递增的数字。字符串不能递增。将列设为int
Bozho 2010年

数据库中的myid列的类型为number。而且我已经将我的pojo中的id更改为int了。我得到错误序列不存在
塞德里克

2
对于Oracle,SEQUENCE是最接近自动增量的东西。除非让Hibernate生成架构,否则必须提前创建序列。如果您认为某个时候可能支持多个数据库,请使用TABLE。
Brian Deterling 2010年

2
不要使用身份,Oracle不支持身份,它支持序列。
JuanZe 2010年

32

如下进行:

@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值。我试图用整数或整数设置setID,但它随时都使用max。我该怎么办?
desudesudesu 2012年

使用@GenericGenerator(NAME =“incrementId”,战略=“分配”)@GeneratedValue(发电机=“incrementId”),它可以让你设定的ID你own.But如果你没有通过ID那么这将是0。
Ravi Kant 2014年

@Kaushik Lele strategy =“ increment”是休眠的内置增量策略吗?它属于这些SEQUENCE,IDENTITY,AUTO,TABLE中的哪一个?
感觉很好,编程很不错

表中约有7亿条记录呢?我认为这可能是没有索引的问题
user2171669

10

费耶

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

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

这使我得到一个同样的错误,即该列不能为null,所以我只是删除了@NotNull注释,使该属性为null,它起作用了!


7

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;

有关更多详细信息,请检查链接


4

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

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

MySQL是@Column(columnDefinition =“ integer auto_increment”)
yeralin

1

如果在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列的

就我而言,我像这样用JSONHTML POST ...

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.