繁体   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