簡體   English   中英

如何使用 Spring Boot 正確實現 @ForeignKey

[英]How to implement @ForeignKey correctly using Spring Boot

我正在使用 Spring Boot 開發我的第一個應用程序來構建我的 web 服務。 該應用程序應該是一個簡單的健身房管理系統。 實際上,我設法為管理員(健身房所有者實體)和 Palestra(健身房實體)創建了 model、controller 和存儲庫。

管理員.java

@Entity(name="admin")
public class Admin {
    private @Id @GeneratedValue Long id_admin;
    private String nome;
    private String cognome;
    private String email;
    private String password;
    
    // Retionships
    @OneToMany(mappedBy="admin", fetch = FetchType.LAZY)
    private List <Palestra> palestre;
    
    Admin() {} // Empty constructor

    public Admin(Long id_admin, String nome, String cognome, String email, String password) {
        super();
        this.nome = nome;
        this.cognome = cognome;
        this.email = email;
        this.password = password;
    }

    public Long getId_admin() {
        return id_admin;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return cognome;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Palestra> getPalestre() {
        return palestre;
    }

    public void setPalestre(List<Palestra> palestre) {
        this.palestre = palestre;
    }
    
}

AdminController.java

@RestController
public class AdminController {
    private final AdminRepository adminRepository;
    
    public AdminController(AdminRepository repository) {
        adminRepository = repository;
    }
    
    @GetMapping("/admins")
    Iterable<Admin> getAdmins() {
        return adminRepository.findAll();
    }
    
    @PostMapping("/admins")
    Admin createAdmin(@RequestBody Admin newAdmin) {
        return adminRepository.save(newAdmin);
    }
}

帕萊斯特拉.java

@Entity(name="palestra")
public class Palestra {
    private @Id @GeneratedValue Long id_palestra;
    private String nome;
    private String via;
    private int civico;
    private String citta;
    
    // Relationships
    @OneToMany(mappedBy="palestra")
    private List<Trainer> trainers;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="id_admin")
    private Admin admin;
    
    public Palestra() {} // Empty constructor

    public Palestra(Long id_palestra, String nome, String via, int civico, String citta) {
        super();
        this.id_palestra = id_palestra;
        this.nome = nome;
        this.via = via;
        this.civico = civico;
        this.citta = citta;
    }

    public Long getId_palestra() {
        return id_palestra;
    }

    public void setId_palestra(Long id_palestra) {
        this.id_palestra = id_palestra;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getVia() {
        return via;
    }

    public void setVia(String via) {
        this.via = via;
    }

    public int getCivico() {
        return civico;
    }

    public void setCivico(int civico) {
        this.civico = civico;
    }

    public String getCitta() {
        return citta;
    }

    public void setCitta(String citta) {
        this.citta = citta;
    }

    public Admin getAdmin() {
        return admin;
    }

    public void setAdmin(Admin admin) {
        this.admin = admin;
    }

}

PalestraController.java

@RestController
public class PalestraController {
    private final PalestraRepository palestraRepository;
    
    public PalestraController(PalestraRepository repository) {
        palestraRepository = repository;
    }
    
    @GetMapping("/palestre")
    Iterable<Palestra> getPalestre() {
        return palestraRepository.findAll();
    }
    
    @PostMapping("/palestre")
    Palestra createPalestra(@RequestBody Palestra newPalestra) {
        return palestraRepository.save(newPalestra);
    }
}

我使用 Postman 發送和測試請求: 在此處輸入圖像描述 在此處輸入圖像描述 這是存儲在數據庫中的結果: 在此處輸入圖像描述

如您所見, id_admin應該是外鍵,但具有 NULL 值。 我該如何解決這個問題?

您必須鏈接實體...

@PostMapping("/admins")
@Transactional
Admin createAdmin(@RequestBody Admin newAdmin) {
  //find palestra by id
  Palestra p = palestraRepo.findById(newAdmin.id_palestra);
  Admin storedAdmin = adminRepository.save(newAdmin);
  //link with admin
  p.setAdmin(storedAdmin);
  palestraRepo.save(p)
  return storedAdmin;
}

我回答我自己的問題,因為我發現了問題。 在我創建模型、控制器和存儲庫的方式中,實體已經通過關系鏈接(@ManyToOne 和@OneToMany)。 真正的“問題”是如何通過 Postman 提交請求。 我必須像這樣在我的請求中手動插入 admin_id 值: 在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM