Почему таблица базы данных не генерируется автоматически для сущности - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю с Spring Data JPA, реализация JPA находится в режиме гибернации.База данных, которую я использую - Mysql.
Объект будет сопоставлен с таблицей Mysql, и таблица будет создана автоматически, когда я запустил приложение Spring.Однако, когда я изменил идентификатор с 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

Нашел похожий вопрос без ответа, но проголосовал, кажется, что больше людей встречалось с этими проблемами.

Невозможно использовать String как @Id с SpringData

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я думаю, что ваша проблема связана с этим .В основном, в зависимости от версии MySQL, которую вы используете, и кодировки ваших строк, максимальный размер VARCHAR может варьироваться.

Я не знаю этих параметров, но для безопасности я бы определил свою строкуPK с максимальной длиной 191. В зависимости от вашей версии MySQL и кодировки, может быть выше.

@Id
@Column(length = 191)
private String id;
0 голосов
/ 10 декабря 2018

В случае, если вы не зададите стратегию создания идентификатора, Hibernate по умолчанию будет использовать GenerationType.AUTO.

Если вы хотите String UUID в качестве идентификатора, вы можете использовать

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

См. как использовать идентификатор со строковым типом в jpa-hibernate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...