我有一个使用注解的Hibernate J2EE应用程序。如何在我的POJO类中注释Id字段以将其设置为自动增量或自动生成?在添加bean时,我是否将该字段保留为空?
我有一个使用注解的Hibernate J2EE应用程序。如何在我的POJO类中注释Id字段以将其设置为自动增量或自动生成?在添加bean时,我是否将该字段保留为空?
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
在持久化时,如果您使用的是Integer
/ Long
包装器,则将其设置为null
(0
)。否则,将其留空。
在某些情况下,AUTO
策略会被解析为SEQUENCE
而不是IDENTITY
或TABLE
,因此您可能想要手动将其设置为IDENTITY
或TABLE
(具体取决于底层数据库)。
看起来您通过SEQUENCE
+ 指定序列名称的方式解决了问题。
按照以下步骤进行:
@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 (?, ?, ?, ?, ?)
顺便提一下
使用 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注释,将属性留空,这样就可以解决问题了!
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;
了解更多详情,请查看链接。
columnDefinition
可能是一个选项。这样做的好处是,即使在没有使用Hibernate的情况下,模式也会自动生成该值。但这可能会使您的代码与特定的数据库相关联。import javax.persistence.Column;
@Column(columnDefinition = "serial") // PostgreSQL
@Column(columnDefinition = "integer auto_increment") // MySql
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;
为了使此方法可行,请确保在执行session.SaveOrUpdate时,将列special_serial_pk的值传递为NULL。
在我的情况下,我使用类似以下方式的HTML POST和JSON...
{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}
使用NetBeans从MySQL数据库创建新实体类时,如果有一个auto_increment列,它会为你创建一个带有以下hibernate.hbm.xml的属性: id是自动增量。