我正在撰寫一個 Web 應用程式(代表網上銀行作業)。我在資料庫中有一個物體“用戶”和一個相應的表。另外,我有一個注冊表單,可以通過 Thymeleaf 傳輸輸入的資料。
我的物體有兩行在資料庫中有默認值。這些是“角色”行和“狀態”。我在資料庫中設定了默認值。
但是,當我在注冊表中輸入資料并單擊“注冊”時,資料成功傳輸到資料庫,但是,具有自己默認值的兩行(角色和狀態)為空型別。為什么沒有自動設定默認值?
我的物體類:
@Data
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
@Column(name = "password")
private String password;
@Enumerated(value = EnumType.STRING)
@Column(name = "status")
private Status status;
@Enumerated(value = EnumType.STRING)
@Column(name = "role")
private Role role;
}
我在資料庫表中的設定:

當我檢查屬性“NOT NULL”時,我收到一條錯誤訊息,告訴我“角色”行不能為空。
這就是我注冊新用戶時我的表格的樣子:

我的控制器:
@Controller
@RequestMapping("/auth")
public class AuthController {
private final UserRepository userRepository;
@Autowired
public AuthController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@GetMapping("/login")
public String login() {
return "/auth/login";
}
@GetMapping("/signup")
public String signUp(User user, Model model) {
return "/auth/registration";
}
@PostMapping("/signup")
public String signUpProcess(@ModelAttribute User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "redirect:/auth/registration";
}
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(12);
user.setPassword(passwordEncoder.encode(user.getPassword()));
userRepository.save(user);
return "redirect:/auth/login";
}
}
注冊頁面:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
<head>
<!-- Required meta tags -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Registration</title>
<!-- This style must be at the top -->
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<link rel="stylesheet" href="/static/login.css">
</head>
<body>
<form class="form-signin" th:method="post" th:object="${user}"> <!-- added th:method and th:object -->
<div class="text-center mb-4">
<img class="mb-4" src="/static/images/login/codelib_logo.png" alt="" width="72" height="72">
<h1 class="h3 mb-3 font-weight-normal">Registration</h1>
<p> Enter all the required information into the forms below. </p>
</div>
<div class="form-label-group">
<input type="text" id="inputFirstName" th:field="*{firstName}" class="form-control" placeholder="First Name" required>
<label for="inputFirstName">First Name</label>
</div>
<div class="form-label-group">
<input type="text" id="inputLastName" th:field="*{lastName}" class="form-control" placeholder="Last Name" required>
<label for="inputLastName">Last Name</label>
</div>
<div class="form-label-group">
<input type="email" id="inputEmail" th:field="*{email}" class="form-control" placeholder="Email address" required autofocus>
<label for="inputEmail">Email address</label>
</div>
<div class="form-label-group">
<input type="password" id="inputPassword" th:field="*{password}" class="form-control" placeholder="Password" required>
<label for="inputPassword">Password</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign up</button>
<br>
<p>Already registered? <a href="/auth/login">Click to sign in</a></p>
<p class="mt-5 mb-3 text-muted text-center">© BlackBank 2022</p>
</form>
<!-- Scripts related to Bootstrap -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X 965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH 8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM B07jRM" crossorigin="anonymous"></script>
</body>
</html>
如果我沒有指定一些有價值的資訊,請告訴我。
更新:
顯示創建表:
CREATE TABLE `users` (
`id` bigint NOT NULL AUTO_INCREMENT,
`first_name` varchar(100) NOT NULL,
`last_name` varchar(100) NOT NULL,
`email` varchar(100) NOT NULL,
`password` varchar(150) NOT NULL,
`role` varchar(20) NOT NULL DEFAULT 'USER',
`status` varchar(20) NOT NULL DEFAULT 'ACTIVE',
PRIMARY KEY (`id`),
UNIQUE KEY `users_id_uindex` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
我的角色和狀態類(列舉):
角色類:
public enum Role {
// Each role has a specific set of permissions
USER(Set.of(Permission.USERS_READ)),
ADMIN(Set.of(Permission.USERS_READ, Permission.USERS_WRITE, Permission.USERS_UPDATE)),
OWNER(Set.of(Permission.USERS_READ, Permission.USERS_WRITE, Permission.USERS_UPDATE, Permission.USERS_DELETE));
private Set<Permission> permissions;
Role(Set<Permission> permissions) {
this.permissions = permissions;
}
public Set<Permission> getPermissions() {
return permissions;
}
public Set<SimpleGrantedAuthority> getAuthorities() {
return getPermissions().stream().map(permission -> new SimpleGrantedAuthority(permission.getPermission())).collect(Collectors.toSet());
}
}
狀態.類:
public enum Status {
ACTIVE, BANNED;
}
uj5u.com熱心網友回復:
@cloumn 注釋應該如下所示
@Column(name = "status", nullable=false, length = 20, columnDefinition = "varchar(20) default 'ACTIVE'")
@Column(name = "role", nullable=false, length = 20, columnDefinition = "varchar(20) default 'USER'")
uj5u.com熱心網友回復:
DEFAULT在本機查詢的情況下(在休眠狀態下),在表上定義的約束將起作用。
"INSERT INTO USERS (id, first_name, last_name, email, password) VALUES (v1, v2, v3, v5)"-- // 在這種情況下,未指定欄位(狀態,角色),資料庫將設定默認值(活動,用戶)
另一種解決方案是在物體類中使用注釋
@PrePersist來檢查欄位的值并在為空時更改它(在保存物件之前)。@PrePersist public void control() { if (status == null) setStatus("ACTIVE"); }
uj5u.com熱心網友回復:
由于被持久化的物體對這兩個欄位具有空值,因此它將覆寫指定的默認值。您可以應用 3 種方法
直接在物體類中分配默認值(可以被物體設定器覆寫)
private Role role = Roles.user;使用生命周期回呼注解@Prepersist/@PreUpdate(最推薦,將覆寫任何現有值,也可用于執行邏輯。)
正如 Amir 所建議的,使用屬性“columnDefinition”(可以被物體設定器覆寫)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/428671.html
上一篇:在從類生成的模式和從檔案加載的初始資料之后插入新條目時出現JdbcSQLIntegrityConstraintViolationException
