休眠自动增量ID

ced*_*ric 78 java hibernate auto-increment

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

Boz*_*zho 148

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
Run Code Online (Sandbox Code Playgroud)

你坚持下去吧null(0)(null如果你使用Integer/ Longwrappers)

在某些情况下,AUTO策略被解决为使用SEQUENCE而不是IDENTITY或者TABLE,因此您可能希望手动将其设置为IDENTITYTABLE(取决于底层数据库).

似乎SEQUENCE+ 指定了适合您的序列名称.

  • autoincrement意味着它是一个递增的数字.字符串不能递增.使列成为int (4认同)
  • 对于Oracle来说,SEQUENCE是最接近自动增量的东西.除非你让Hibernate生成你的模式,否则你必须提前创建序列.如果您认为某些时候可能支持多个数据库,请使用TABLE. (2认同)
  • 不使用标识,Oracle不支持标识,它支持序列. (2认同)

Kau*_*ele 31

做到如下: -

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

您可以使用任意名称而不是kaugen.它工作得很好,我可以在控制台上看到下面的查询

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)
Run Code Online (Sandbox Code Playgroud)


jmo*_*ira 7

FYI

使用带有mysql*auto_increment*列的netbeans New Entity Classes,可以创建一个带有以下注释的属性:

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

这让我得到了同样的错误,说列不能为空,所以我只是删除@NotNull anotation,留下属性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;
Run Code Online (Sandbox Code Playgroud)

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


alf*_*onx 5

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

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
Run Code Online (Sandbox Code Playgroud)