Nguyen Dang
Nguyen Dang

Reputation: 15

Cannot using one-to-one relation in java spring

i have a question in javaspring, when using one-to-one relation, why i cannot mapping the username in khachHang class with the login class, althought the login.getUsername is not null, i have tried many times, but it awlays wrong, the CCCD can import to Login class but khachHang cannot get the variable of Login. What is the point of this error. Thank you.

This is my Login class:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "Login")
public class Login {

    @Id
    private String username;

    private String password;
    private boolean role;

    @OneToOne
    @JoinColumn(name = "CCCD", referencedColumnName = "CCCD")
    private KhachHang khachHang;

    public Login(String username, String password, boolean role) {
        this.username = username;
        this.password = password;
        this.role = role;
    }
}

This is my KhachHang Class:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "ThongTinKhachHang")
public class KhachHang {

    @Id
    private String CCCD;

    private String tenKhachHang;
    private boolean gioiTinh;
    private String diaChi;
    private String email;
    private String soDienThoai;

    @OneToOne(mappedBy = "khachHang")
    @JoinColumn(name = "username", referencedColumnName = "username")
    private Login login;

    @OneToMany(mappedBy = "khachHang", cascade = CascadeType.ALL)
    private List<ChiTietDatTour> chiTietDatTours;

    public KhachHang(String CCCD, String tenKhachHang, boolean gioiTinh, String diaChi, String email, String soDienThoai, Login login) {
        this.CCCD = CCCD;
        this.tenKhachHang = tenKhachHang;
        this.gioiTinh = gioiTinh;
        this.diaChi = diaChi;
        this.email = email;
        this.soDienThoai = soDienThoai;
        this.login = login;
    }
}

And this is the result when query from database. enter image description here

Update: I have updated the save to database logic:

    @PostMapping("/signup/userSignUp")
    public String userSaveToDatabase(@RequestParam(name = "hoTen") String hoTen,
                                     @RequestParam(name = "username") String username,
                                     @RequestParam(name = "phonenumber") String phoneNumber,
                                     @RequestParam(name = "CCCD") String CCCD,
                                     @RequestParam(name = "email") String email,
                                     @RequestParam(name = "diachi") String diaChi,
                                     @RequestParam(name = "password") String password,
                                     @RequestParam(name = "reconfirm") String reconfirm,
                                     @RequestParam(name = "gioiTinh") boolean gioiTinh,
                                     Model model) {

        if (loginDAO.existsByUsername(username)) {
            model.addAttribute("error", "Username already exists.");
            return "redirect:/signup";
        }

        if (!password.equals(reconfirm)) {
            model.addAttribute("error", "Password and reconfirm password do not match.");
            return "redirect:/index";
        }

        if (!loginDAO.existsCCCD(CCCD).isEmpty()) {
            model.addAttribute("error", "CCCD already exists.");
            return "redirect:/book";
        }

        if (!checkPassword(password) || !validateEmail(email) ||
                !checkCCCD(CCCD) || !checkPhone(phoneNumber) || !checkAddress(diaChi)) {
            return "redirect:/test3";
        }

        Login login = new Login(username, password, false);
        KhachHang khachHang = new KhachHang(CCCD, hoTen, gioiTinh, diaChi, email, phoneNumber, login);

        login.setKhachHang(khachHang);
        khachHang.setLogin(login);

        khachHangDAO.save(khachHang);
        loginDAO.save(login);

        return "redirect:/test2";
    }

Upvotes: -1

Views: 83

Answers (1)

lane.maxwell
lane.maxwell

Reputation: 5852

I think you're just missing the cascade. On both sides of your OneToOne, add either CascadeType.ALL or CascadeType.PERSIST.

Then, you can remove the explicit call to save the login loginDAO.save(login) and save both entities with your call to khachHangDAO.save(khachHang);.

login.setKhachHang(khachHang);
khachHang.setLogin(login);

khachHangDAO.save(khachHang);

Upvotes: 0

Related Questions