【问题标题】:Spring @GeneratedValue annotations not working for Auto increment fieldSpring @GeneratedValue 注释不适用于自动增量字段
【发布时间】:2016-07-21 20:30:43
【问题描述】:

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

我遇到了 id 主键的问题。如果我使用它不会自动增加事件: @GeneratedValue(strategy=GenerationType.IDENTITY) @GeneratedValue(策略=GenerationType.AUTO) @GeneratedValue(strategy=GenerationType.SEQUENCE) @GeneratedValue(strategy=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;

【问题讨论】:

  • 当你这样做时这不起作用:@Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") ??
  • 是的,它不起作用。即使我尝试:@GeneratedValue(strategy=GenerationType.IDENTITY) @GeneratedValue(strategy=GenerationType.SEQUENCE) @GeneratedValue(strategy=GenerationType.TABLE)
  • 我使用提到的步骤(创建表,脚手架,添加@GeneratedValue 注释)尝试了这个并且没有问题。您可以尝试在没有 ID 值的情况下手动添加一行(使用 SQL 语句并提交)并检查它是否有效?
  • @TonyWeddle 您好,感谢您的帮助。如果我尝试使用 SQL 语句,它可以正常工作。 --- 现在我才发现,如果我发布 id=0 的对象,它会在数据库中自动增加。
  • 所以,只是为了确认;如果表中已经有一个对象(在您的情况下 ID=0),那么您可以在不设置 ID 值的情况下保存新对象。那正确吗?如果是这样,那么我想你们都准备好了,不过,正如我所说,即使是一张空桌子,我也没有发现问题。我的测试是在 Linux 上进行的,但我不知道这是否重要。我的 MySql 版本是 5.5.47。

标签: mysql hibernate spring-mvc scaffolding myeclipse


【解决方案1】:

不要尝试设置 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?

【讨论】:

  • 谢谢,现在,每当我将对象保存到数据库时,我可以通过将值 0 设置为 ID 来解决这个问题,然后在 DB 中生成 id 值并分配给 ID 字段。我不需要@GeneratedValue.. 注释。那些@Basic(fetch = FetchType.EAGER) 是由myeclipse 生成的。
【解决方案2】:

您应该删除以下内容:

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

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

【讨论】:

  • 谢谢,现在,每当我将对象保存到数据库时,我可以通过将值 0 设置为 ID 来解决这个问题,然后在 DB 中生成 id 值并分配给 ID 字段。我不需要@GeneratedValue.. 注释。
猜你喜欢
  • 2011-05-05
  • 2020-04-30
  • 2011-03-10
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2011-09-02
  • 2020-03-13
  • 2021-11-15
相关资源
最近更新 更多