我正在使用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> {
}
控制台中的错误输出为:
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
找到了一个类似的问题,但是没有投票,但似乎有更多的人遇到了这个问题。
答案 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;