【问题标题】:Why database table is not automatically generated for a Entity为什么不会为实体自动生成数据库表
【发布时间】:2019-05-11 00:40:19
【问题描述】:

我正在使用 Spring Data JPA,JPA 的实现是休眠的。 我使用的数据库是 Mysql。
实体将映射到 Mysql 表,并且在我启动 Spring 应用程序时自动创建该表。但是,当我将 ID 从 Integer 更改为 String 时,该表消失了,无法再创建。我有点困惑为什么会这样。让我发布代码比较如下。

之前的Entity

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity 
public class User {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Integer id;

  private String name;

  private String email;

  public String getId() {
    return id;
  }

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

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

}

Entity 之后:

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity 
public class User {
  @Id
  private String id;

  private String name;

  private String email;

  public String getId() {
    return id;
  }

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

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

}

之前的CrudRepository

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;

import gearon.model.entity.User;

// This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
// CRUD refers Create, Read, Update, Delete

@Component
public interface UserRepository extends CrudRepository<User, Integer> {

}

CrudRepository 之后:

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;

import gearon.model.entity.User;

// This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
// CRUD refers Create, Read, Update, Delete

@Component
public interface UserRepository extends CrudRepository<User, String> {

}

编辑1

控制台的错误输出是:

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement

这是由

引起的
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 1000 bytes

编辑2

发现一个类似的问题没有答案但投票,似乎更多的人遇到了这个问题。

Can't use String as @Id with SpringData

【问题讨论】:

    标签: java spring-boot spring-data-jpa


    【解决方案1】:

    如果不指定 id 生成策略,Hibernate 将默认使用GenerationType.AUTO

    如果你想要 String UUID 作为 id,你可以使用

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "PR_KEY")
    private String prKey;
    

    参考how-to-use-id-with-string-type-in-jpa-hibernate

    【讨论】:

    【解决方案2】:

    我认为您的问题是related to this。基本上,根据您使用的 MySQL 版本和字符串的编码,最大 VARCHAR 大小可能会有所不同。

    我不知道你的那些参数,但为了安全起见,我会将我的 String PK 定义为最大长度为 191。根据你的 MySQL 版本和编码,可以更高。

    @Id
    @Column(length = 191)
    private String id;
    

    【讨论】:

    • 我刚刚通过了hibernate注解,决定尝试一下length参数,同时我发现你已经发布了这个答案。谢谢,成功了。
    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多