【问题标题】:Java JPA GenerationType.Auto value always nullJava JPA GenerationType.Auto 值始终为空
【发布时间】:2017-05-28 18:44:59
【问题描述】:

我在同一个项目中有几个类,其中的 id 总是自动生成的。但是,在这种特定情况下,我的 id 值恰好始终为空。我真的想知道出了什么问题,因为经过一些更改后它停止了工作。并且将它与其他类进行比较,代码似乎是相同的。

package com.checkin.model.entity;
import javax.persistence.*;


@Entity
public class Checkin {

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

@Column(nullable = false)
private String date;

public Checkin(){

}

public Checkin(String date){
    this.date = date;
    System.out.println(this.id);
    System.out.println(this.getId());
}


public Long getId() {return id;}

public void setId(Long id) {this.id = id;}

public String getDate() {return date;}

public void setDate(String date) {this.date = date;}

}

这是保存对象的存储库:

package com.checkin.model.repository;

import com.checkin.model.entity.Checkin;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository("checkinRepository")
public interface CheckinRepository extends CrudRepository<Checkin, Long> {
   Checkin findById(Long id);


}

最后这是我从 Postman 那里得到的结果

enter image description here

【问题讨论】:

  • 底层数据库是什么?并显示 id 列的 DDL 定义
  • 我不确定你所说的 DDL 定义是什么意思。我将 Hibernate 与 JPA 一起使用。关于您关于底层数据库的问题,这是我在 build.gradle 中使用的内容: compile("org.springframework.boot:spring-boot-starter-data-jpa") compile("com.h2database:h2" )
  • @AntonioDelaTorre 设置休眠以重新创建数据库表(和丢失的信息)并启用 SQL 日志。您将在日志中有DDL(SQL CREATE TABLE 语句)。其他生成 DDL 的方式:geowarin.github.io/generate-ddl-with-hibernate.html。它有点复杂。

标签: java json hibernate jpa persistence


【解决方案1】:

Generation类型AUTO设置底层数据库生成ID http://docs.oracle.com/javaee/6/api/javax/persistence/GenerationType.html#AUTO

在这种情况下,您要检查的是 H2 数据库 id 列是否具有生成 ID 的属性。我猜它没有。我自己不太使用 AUTO,所以我假设您的 Auto 是否适用于其他 Entities,那么这些设置正确。

您可能需要执行以下操作之一:

  • 迁移到这里
  • 在 H2 中更新列
  • 重新创建表

【讨论】:

  • 感谢您的回答!我正在关注本教程:spring.io/guides/gs/accessing-data-jpa 但我认为问题不在于 h2 或来自 JPA 的东西。因为,当我以 Application.java 中所述的方式创建对象并将其保存到数据库中时,使用: public CommandLineRunner demo(CheckinRepository repository) { return (args) -> { // 保存几个客户存储库。保存(新签到(“杰克”));我得到:2017-05-29 16:50:09.035 INFO 33570 --- [main] com.checkin.Application : Checkin: [id=1, Date='Jack']
  • 所以我认为它与RESTful接口有关
  • 非常感谢!!我解决了这个问题......这是你能想象到的最愚蠢的事情之一......我评论了数据库中的 .save ,如果数据库没有收到对象,它自然不会生成 ID......
  • 很高兴你把它整理好了。并感谢您将答案标记为正确,即使您遇到了不同的问题。请您发布问题和您所做的具体更改并将您自己的答案标记为正确吗?我认为这对其他人非常有益。或者至少有第二种可能的解决方案将有很长的路要走。谢谢
猜你喜欢
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2019-08-26
  • 2013-11-01
相关资源
最近更新 更多