首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不自动为实体生成数据库表?

问为什么不自动为实体生成数据库表?
EN

Stack Overflow用户
提问于 2018-12-10 05:49:55
回答 2查看 220关注 0票数 0

我正在使用Spring,JPA的实现是hibernate。我使用的数据库是Mysql。

该实体将映射到Mysql表,并在我启动Spring应用程序时自动创建该表。但是,当我将ID从Integer更改为String时,表就消失了,不能再创建了。我有点搞不懂为什么会这样。让我发布代码比较如下。

Entity之前:

代码语言:javascript
复制
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之后:

代码语言:javascript
复制
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之前:

代码语言:javascript
复制
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之后:

代码语言:javascript
复制
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

控制台中的错误输出是:

代码语言:javascript
复制
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement

它是由

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-10 13:11:30

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

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

代码语言:javascript
复制
@Id
@Column(length = 191)
private String id;
票数 1
EN

Stack Overflow用户

发布于 2018-12-10 06:05:00

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

如果您希望使用String UUID作为id,则可以使用

代码语言:javascript
复制
@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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53700159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档