Spring @GeneratedValue注释不适用于自动增量字段

时间:2016-04-01 21:50:29

标签: mysql hibernate spring-mvc scaffolding myeclipse

我在MyEclipse中使用Scaffolding生成Web应用程序项目,使用spring MVC和MySQL数据库。请给我一些解决问题的线索。

我遇到id主键问题。如果我使用它不会自动增加事件: @GeneratedValue(策略= GenerationType.IDENTITY) @GeneratedValue(策略= GenerationType.AUTO) @GeneratedValue(策略= GenerationType.SEQUENCE) @GeneratedValue(策略= GenerationType.TABLE)

我有几个表,主键设置为AUTO_INCREMENT。像这个例子:

CREATE TABLE IF NOT EXISTS `ehealthdb`.`timestamp` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '',
  `login_date` DATETIME NULL COMMENT '',
  `logout_date` DATETIME NULL COMMENT '',
  `create_date` DATETIME NOT NULL COMMENT '',
  `update_date` DATETIME NULL COMMENT '',
  `isActive` TINYINT(1) NULL COMMENT '',
  PRIMARY KEY (`id`)  COMMENT '')
ENGINE = InnoDB;

当我尝试使用生成的帖子URL和以下json有效负载使用保存时:

{
 "loginDate":"1374839856000",
 "logoutDate":"1374839856000",
 "createDate":"1374839856000",
 "updateDate":"1374839856000",
 "isActive":true
}
  

请求处理失败;嵌套异常是javax.persistence.PersistenceException:   org.hibernate.id.IdentifierGenerationException:此类的ID   必须在调用save()之前手动分配:   ehealth.domain.Timestamp

我认为这是由于缺少@GeneratedValue引起的,我的主键上没有创建脚手架。我必须手动添加它,如下所示:

但它仍然不起作用。它仍然会出错。

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY) //add this 
@Column(name = "id", unique = true, nullable = false)
@Basic(fetch = FetchType.EAGER)

@XmlElement
Integer id;

2 个答案:

答案 0 :(得分:3)

请勿尝试设置ID字段。它会自动处理。

使用@GeneratedValue(strategy = GenerationType.IDENTITY)。确保您的Persistence.xml具有

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />

应该使用Hibnerate版本4或5。

另外,我从未在ID列上看到FetchType。删除它。

@Basic(fetch = FetchType.EAGER)

我这样做:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

另外,可能应该了解完整设置。什么版本的Spring?

答案 1 :(得分:0)

您应该删除以下内容:

@Column(name = "id", unique = true, nullable = false)
@Basic(fetch = FetchType.EAGER)

这些都是默认值,所以没有必要把它放在那里。 我不确定它会解决你的问题。