Java Spring中不能使用一对一关系

gupuwyp2  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(184)

我在javaspring中有一个问题,当使用一对一关系时,为什么我不能将khachHang类中的用户名Map到登录类,尽管login. getName不为null,我已经尝试了很多次,但它是错误的,CCCD可以导入到Login类,但khachHang无法获得Login的变量。这个错误是什么意思。谢谢。
这是我的Login类:

  1. @Entity
  2. @Data
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. @Table(name = "Login")
  6. public class Login {
  7. @Id
  8. private String username;
  9. private String password;
  10. private boolean role;
  11. @OneToOne
  12. @JoinColumn(name = "CCCD", referencedColumnName = "CCCD")
  13. private KhachHang khachHang;
  14. public Login(String username, String password, boolean role) {
  15. this.username = username;
  16. this.password = password;
  17. this.role = role;
  18. }
  19. }

字符串
这是我的KhachHang类:

  1. @Entity
  2. @Data
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. @Table(name = "ThongTinKhachHang")
  6. public class KhachHang {
  7. @Id
  8. private String CCCD;
  9. private String tenKhachHang;
  10. private boolean gioiTinh;
  11. private String diaChi;
  12. private String email;
  13. private String soDienThoai;
  14. @OneToOne(mappedBy = "khachHang")
  15. @JoinColumn(name = "username", referencedColumnName = "username")
  16. private Login login;
  17. @OneToMany(mappedBy = "khachHang", cascade = CascadeType.ALL)
  18. private List<ChiTietDatTour> chiTietDatTours;
  19. public KhachHang(String CCCD, String tenKhachHang, boolean gioiTinh, String diaChi, String email, String soDienThoai, Login login) {
  20. this.CCCD = CCCD;
  21. this.tenKhachHang = tenKhachHang;
  22. this.gioiTinh = gioiTinh;
  23. this.diaChi = diaChi;
  24. this.email = email;
  25. this.soDienThoai = soDienThoai;
  26. this.login = login;
  27. }
  28. }


这是从数据库.

查询的结果
更新:我已经更新了保存到数据库逻辑:

  1. @PostMapping("/signup/userSignUp")
  2. public String userSaveToDatabase(@RequestParam(name = "hoTen") String hoTen,
  3. @RequestParam(name = "username") String username,
  4. @RequestParam(name = "phonenumber") String phoneNumber,
  5. @RequestParam(name = "CCCD") String CCCD,
  6. @RequestParam(name = "email") String email,
  7. @RequestParam(name = "diachi") String diaChi,
  8. @RequestParam(name = "password") String password,
  9. @RequestParam(name = "reconfirm") String reconfirm,
  10. @RequestParam(name = "gioiTinh") boolean gioiTinh,
  11. Model model) {
  12. if (loginDAO.existsByUsername(username)) {
  13. model.addAttribute("error", "Username already exists.");
  14. return "redirect:/signup";
  15. }
  16. if (!password.equals(reconfirm)) {
  17. model.addAttribute("error", "Password and reconfirm password do not match.");
  18. return "redirect:/index";
  19. }
  20. if (!loginDAO.existsCCCD(CCCD).isEmpty()) {
  21. model.addAttribute("error", "CCCD already exists.");
  22. return "redirect:/book";
  23. }
  24. if (!checkPassword(password) || !validateEmail(email) ||
  25. !checkCCCD(CCCD) || !checkPhone(phoneNumber) || !checkAddress(diaChi)) {
  26. return "redirect:/test3";
  27. }
  28. Login login = new Login(username, password, false);
  29. KhachHang khachHang = new KhachHang(CCCD, hoTen, gioiTinh, diaChi, email, phoneNumber, login);
  30. login.setKhachHang(khachHang);
  31. khachHang.setLogin(login);
  32. khachHangDAO.save(khachHang);
  33. loginDAO.save(login);
  34. return "redirect:/test2";
  35. }

8xiog9wr

8xiog9wr1#

我想你只是错过了级联。在OneToOne的两侧,添加CascadeType.ALLCascadeType.PERSIST
然后,您可以删除对登录loginDAO.save(login)的显式保存调用,并通过对khachHangDAO.save(khachHang);的调用来保存这两个实体。

  1. login.setKhachHang(khachHang);
  2. khachHang.setLogin(login);
  3. khachHangDAO.save(khachHang);

字符串

相关问题