当前位置: 首页 > 知识库问答 >
问题:

Spring Boot JPA初始化数据-SQL语句中的语法错误...预期的“标识符”

陆安国
2023-03-14

尝试在启动时将数据实现到我的Spring Boot应用程序中。正如我所研究的,它应该是这样工作的:

用户角色类:

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class UserRole {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String role;
}

模式。sql

CREATE TABLE `user_role` (
    `id` bigint(20) NOT NULL,
    `role` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

data.sql

INSERT INTO user_role (role) VALUES ('ADMIN');
INSERT INTO user_role (role) VALUES ('USER');

应用属性

spring.jpa.hibernate.ddl-auto=none
spring.jpa.defer-datasource-initialization=true
spring.sql.init.mode=always

但是,如果我尝试这样做,在构建应用程序时只会出现以下错误:

SQL语句CREATE TABLEUSER_ROLEIDBIGINT([*] 20)NOTNULL,ROLEVARCHAR(255)DEFAULT NULL, PRIMary KEY(ID)ENGINE=INNODB DEFAULT CHARSET=UTF8MB4";预期"数组,无形,可见,不,空,作为,默认,生成,开,不,空,AUTO_INCREMENT,默认,NULL_TO_DEFAULT,序列,选择性,注释,约束,注释,主要,唯一,不,空,检查,引用,AUTO_INCREMENT, ., )"; SQL语句:创建表user_roleidbigint(20)不为空,角色varchar(255)DEFAULT NULL,PRIMary KEY(id))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4[42001-202]

有人知道怎么回事吗?

共有2个答案

万嘉石
2023-03-14

如果您使用脚本创建了user_role表,那么问题在于id列定义中缺少AUTO_INCREMENT。因为您希望在不手动添加id值的情况下插入字段。因此,创建表的正确sql代码应该是:

CREATE TABLE `user_role` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `role` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

在这种情况下,插入sql代码将正常工作。

但您应该使用spring生成一个表,并使用存储库插入数据!

UserRole实体的存储库:

public interface UserRoleRepository extends CrudRepository<UserRole, Long> {}

之后,只需使用服务中实体的新实例调用保存方法:

@AllArgsConstructor
@Service
public class YourService {

    private final UserRoleRepository userRoleRepository;

    public void exampleMethod() {
        final UserRole role = new UserRole();
        role.set("ADMIN");
        userRoleRepository.save(role);
    }
}

最后一件事:你真的想为角色创建表吗?我的意思是,如果用户可以创建其他角色,那么好吧,但是如果角色是修复的,那么最好只向用户添加角色字段,其中字段类型是包含用户角色的enum。

public enum UserRole {
    ADMIN,
    USER
}

具有角色字段的用户实体:

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

    @Enumerated(EnumType.STRING)
    private UserRole role;
}
柴博
2023-03-14

异常指定SQL的某些问题。

您必须指定id应该递增:

CREATE TABLE IF NOT EXISTS user_role
(
    id    INT AUTO_INCREMENT PRIMARY KEY,
    role  VARCHAR(50)  null
);

因为稍后插入数据时,例如:

插入user_role(角色)值('ADMIN');

您不直接设置id它应该由DB引擎自动递增。

此外,JPAAPI要求实体必须是可序列化的。您必须按照以下方式进行更新:

public class UserRole implements Serializable {
    private static final long serialVersionUID = 1L;

也许出于你的目的,你选择了最简单的方法。

更难的是使用一些迁移应用程序,比如Flyway或Liquiebase,并为此创建一些init脚本。

然而,在这种情况下,您的DB交互(比如向类添加新字段,从而分别更新DB表)应该通过添加新的迁移脚本来完成。

把它写在这里,因为它太长了,不能像在帖子下面写评论一样。

 类似资料:
  • 我有一个 springboot 应用程序,我想将我的应用程序连接到 H2 数据库。下面是我的架构。 下面是我的应用程序属性。 但是,我面临以下问题: 由:org.h2.jdbc引起。JdbcSQLSyntaxErrorException:SQL语句“create table employee(id bigint not null auto_increment,email varchar(255),

  • 我在尝试使用flyway和hibernate为PostgresSql创建表时遇到语法错误的问题。Trip类与其他类没有关系(还没有)。我已经成功地为其他两个类创建了购买和用户,但是这个只是给出了错误。 错误信息: [错误]测试运行:1,失败:0,错误:1,跳过:0,所用时间:3.003秒 SQL状态:42000错误代码:42000消息:SQL语句“CREATE TABLE TRIP(ID BIGI

  • 我不知道他们谁错了。

  • 按照对象的类型以及初始化时的上下文,C++提供了五花八门的对象初始化的方式。若不慎误用,可能会产生匪夷所思的谬误,而且还伴随着莫名其妙的错误(调试)信息。考虑如下的代码: string a[] = { “foo”, ” bar” }; //正确:初始化数组变量 //错误:初始化列表应用在了非聚合的向量上 vector<string> v = { “foo”, ” bar” }; void f(s

  • MySQL 5.1对服务器一方的预制语句提供支持。如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势。候选界面包括MySQL C API客户端库(用于C程序)、MySQL Connector/J(用于Java程序)和MySQL Connector/NET。例如,C API可以提供一套能组成预制语句API的函数调用。请参见25.2.4节,

  • 我从Spring Boot进行了升级 它创建序列,但不创建任何表。查看跟踪,它显示了创建表中的语法错误 SQL:SQL 语句中的语法错误(一个示例): 事实上,检查qith H2控制台或SQl linter它将“IDENTITY[*]”标记为错误,否则它将在H2中工作。 第二次尝试也是失败的。我把 并将Spring文档 https://docs.spring.io/spring-batch/doc