嘗試在啟動時將資料實作到我的 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;
資料.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 TABLE
USER_ROLE(IDBIGINT([*]20) NOT NULL,ROLEVARCHAR(255) DEFAULT NULL, PRIMARY KEY (ID)) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4”;預期“陣列,不可見,可見,NOT,NULL,AS,DEFAULT,GENERATED,ON,NOT,NULL,AUTO_INCREMENT,DEFAULT,NULL_TO_DEFAULT,序列,選擇性,COMMENT,CONSTRAINT,COMMENT,PRIMARY,UNIQUE,NOT,NULL,檢查, REFERENCES, AUTO_INCREMENT, ., )"; SQL 陳述句:CREATE TABLEuser_role(idbigint(20) NOT NULL,rolevarchar(255) DEFAULT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 [42001-202]
有人知道出了什么問題嗎?
uj5u.com熱心網友回復:
Exception 指定您的 SQL 存在一些問題。
您必須指定id應該遞增:
CREATE TABLE IF NOT EXISTS user_role
(
id INT AUTO_INCREMENT PRIMARY KEY,
role VARCHAR(50) null
);
因為稍后插入資料時,例如:
INSERT INTO user_role (role) VALUES ('ADMIN');
您不id直接設定它應該由資料庫引擎自動遞增。
此外,JPA API 要求您的物體必須是可序列化的。你必須像下面這樣更新它:
public class UserRole implements Serializable {
private static final long serialVersionUID = 1L;
可能出于您的目的,您選擇了最簡單的方法來執行此操作。
更難的是使用一些遷移應用程式,如Flyway或Liquiebase,并為此創建一些初始化腳本。
但是,在這種情況下,您的資料庫互動(例如向類添加新欄位,從而分別更新資料庫表)應該通過添加新的遷移腳本來完成。
寫在這里,因為太長了,寫在帖子下像評論一樣。
uj5u.com熱心網友回復:
如果您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> {}
之后,只需使用服務中物體的新實體呼叫 save 方法:
@AllArgsConstructor
@Service
public class YourService {
private final UserRoleRepository userRoleRepository;
public void exampleMethod() {
final UserRole role = new UserRole();
role.set("ADMIN");
userRoleRepository.save(role);
}
}
最后一件事:你真的想為角色創建表嗎?我的意思是,如果用戶可以創建其他角色,那么可以,但如果角色是固定的,那么只需將角色欄位添加到欄位型別為包含用戶角色的列舉的用戶即可。
public enum UserRole {
ADMIN,
USER
}
具有角色欄位的用戶物體:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Enumerated(EnumType.STRING)
private UserRole role;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413711.html
標籤:
上一篇:沒有對相關物體的額外查詢
