在我的春季啟動專案中,我使用 PostgreSQL 和 Hibernate。我為用戶創建了 2 個表,為角色創建了單獨的表,創建了物體:
@Entity
@Table(name = "user_account")
public class UserAccount {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@NotNull
@Column(name = "username")
private String userName;
@NotNull
@Column(name = "first_name")
private String firstName;
@NotNull
@Column(name = "last_name")
private String lastName;
@NotNull
@Column(name = "password")
private String password;
@CreationTimestamp
@Column(name = "birthday")
private LocalDateTime birthday;
@NotNull
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "role", referencedColumnName = "id")
private UserRole role;
}
和角色:
@Entity
@Table(name = "role")
public class UserRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Enumerated(value = EnumType.STRING)
@Column(name = "name")
private RoleName name;
}
控制器代碼:
@PostMapping(value = "")
UserAccountDTO create(@RequestBody UserAccount user) {
return userService.create(user);
}
UserService 方法 create():
@Override
public UserAccountDTO create(UserAccount user) {
UserAccount recordedUser = userRepository.save(user);
return modelMapper.map(recordedUser, UserAccountDTO.class);
}
UserRepository(基于 Spring-Data JPA):
@Repository
public interface UserRepository extends JpaRepository<UserAccount, Integer> {
}
dto:
public class UserAccountDTO {
private Integer id;
private String username;
private String firstName;
private String lastName;
private LocalDateTime birthday;
private UserRole role;
}
在表角色中,我已經創建了 2 個角色 - ADMIN、CLIENT(默認值)。因此,當您可以添加用戶并簡單地在將角色表作為一對一參考的列中寫入 role_id 時,我想實作功能。因此,在插入期間,它應該使用角色 ID 鍵添加新用戶的記錄,它指的是必要的角色記錄我必須發送發布請求我必須發送這樣的 JSON:
{
"firstName": "test1",
"lastName": "user",
"password": "test",
"username": "[email protected]",
"role": {
"id": 2,
"name": "CLIENT"
}
}
Hibernate 創建了用戶記錄,但它也添加了名為 CLIENT 的新角色記錄,這是錯誤的。為什么以及我做錯了什么?
uj5u.com熱心網友回復:
問題似乎是您確實在請求中包含了一個帶有 ID 的角色。問題是這個角色只是一個普通的物件,而不是一個 Hibernate 知道或與資料庫中已有的資料有任何關系的物體。
寫完這些,你需要從資料庫中獲取相應的角色并將其設定在UserAccount你想要創建的地方。這意味著您需要相應地更新您的UserService.create()方法:
@Override
public UserAccountDTO create(UserAccount user) {
UserRole userRole = userRoleRepository.findByName(user.getNam()); // I would suggest getting it by name instead of by ID
user.setRole(userRole);
UserAccount recordedUser = userRepository.save(user);
return modelMapper.map(recordedUser, UserAccountDTO.class);
}
附帶說明一下,就像您有一個用于回應的 DTO 一樣,您也應該有一個用于請求的 DTO。在控制器中使用物體作為回應或請求是一種不好的做法,應該避免。我建議您為請求創建以下 DTO:
public class UserAccountCreationRequestDto {
private String userName;
private String firstName;
private String lastName;
private String password;
private LocalDateTime birthday;
private RoleName roleName;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/355784.html
標籤:爪哇 PostgreSQL 弹簧靴 接口 休眠
