为什么没有为实体自动生成数据库表

时间:2018-12-10 05:49:56

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

我正在使用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> {

}

Edit1

控制台中的错误输出为:

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

Edit2

找到了一个类似的问题,但是没有投票,但似乎有更多的人遇到了这个问题。

Can't use String as @Id with SpringData

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

如果未指定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