尝试在启动时将数据实现到我的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_ROLE
(ID
BIGINT([*] 20)NOTNULL,ROLE
VARCHAR(255)DEFAULT NULL, PRIMary KEY(ID
)ENGINE=INNODB DEFAULT CHARSET=UTF8MB4";预期"数组,无形,可见,不,空,作为,默认,生成,开,不,空,AUTO_INCREMENT,默认,NULL_TO_DEFAULT,序列,选择性,注释,约束,注释,主要,唯一,不,空,检查,引用,AUTO_INCREMENT, ., )"; SQL语句:创建表user_role
(id
bigint(20)不为空,角色
varchar(255)DEFAULT NULL,PRIMary KEY(id
))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4[42001-202]
有人知道怎么回事吗?
如果您使用脚本创建了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;
}
异常指定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