春季数据:我无法在数据库中保存我的关系模型

时间:2018-12-16 16:52:53

标签: java spring spring-boot jpa spring-data-jpa

我的Spring Boot API REST中的JPA有一些问题。

我有一个Panier模型,里面有一个LignePanier模型。

当我尝试使用不带lignePanier的panierRepository.save()保存Panier时,没问题,我的panier持久保存在数据库中。

但是,如果我的模型Panier中有lignePanier,则JPA不会持久化LignePanier并抛出异常: “错误:关系“ panier_lignes_panier”不存在”。

如果我直接在数据库中创建该关系,如果我尝试保留该关系,则表示该关系的panier_id为null(如果使用断点,则在代码中不存在)。

@Entity
public class Panier {

    /**
     * Id unique référençant le panier
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    /**
     * UUID du client permettant de référencer son panier de manière unique.
     */
    @NotNull
    private String clientUuid;

    /**
     * Liste des évenements enregistrés dans le panier de l'utilisateur.
     */
    @OneToMany(cascade = {CascadeType.ALL})
    List<LignePanier> lignesPanier;

    public Panier () {
        this.lignesPanier = new ArrayList<LignePanier>();
    }

    public Panier (String clientUuid, List<LignePanier> lignesPanier) { this.clientUuid = clientUuid; this.lignesPanier = lignesPanier; }

    public Integer getId() { return this.id; }

    public void setId(Integer id) { this.id = id; }

    public String getClientUuid() {
        return clientUuid;
    }

    public void setClientUuid(String clientUuid) {
        this.clientUuid = clientUuid;
    }

    public List<LignePanier> getLignesPanier() {
        return lignesPanier;
    }

    public void setLignesPanier(List<LignePanier> lignesPanier) {
        this.lignesPanier = lignesPanier;
    }

    public void addLignePanier(LignePanier lignePanier) {
        if(!this.lignesPanier.contains(lignePanier))
            this.lignesPanier.add(lignePanier);
    }

    @Override
    public String toString() {
        return "Panier{" +
                "id=" + id +
                ", clientUuid='" + clientUuid + '\'' +
                ", lignesPanier=" + lignesPanier +
                '}';
    }
}

    package com.wildadventures.mscommande.models;

import javax.persistence.*;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * Model représentant les lignes d'un panier utilisateur
 */
@Entity
public class LignePanier {

    /**
     * id référençant la ligne de panier.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    /**
     * Référence de l'évenement ajouté au panier
     */
    @NotNull
    private Integer evenementId;

    /**
     * Nombre de place à réserver pour l'évenement
     */
    @NotNull
    @Min(value = 1, message = "Le nombre de participant minimum et de 1")
    private Integer nbPersonne;

    /**
     * Nom de l'évenement référencé.
     */
    @NotNull
    private String aventureNom;

    /**
     * Nombre de places réservées pour l'évenement.
     */
    @NotNull
    @Min(value = 0, message = "La valeur unitaire hors taxe ne peux être inferieure à Zero.")
    private Float prixUnitaireHt;

    /**
     * Date de début de l'évenement
     */
    @NotNull
    private Date dateDebut;

    /**
     * Date de fin de l'évenement
     */
    @NotNull
    private Date dateFin;

    public LignePanier () {}

    public LignePanier(int id, int evenementId, int nbPersonne, String aventureNom, float prixUnitaireHt, Date dateDebut, Date dateFin) {
        this.id = id;
        this.evenementId = evenementId;
        this.nbPersonne = nbPersonne;
        this.aventureNom = aventureNom;
        this.prixUnitaireHt = prixUnitaireHt;
        this.dateDebut = dateDebut;
        this.dateFin = dateFin;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getEvenementId() {
        return evenementId;
    }

    public void setEvenementId(Integer evenementId) {
        this.evenementId = evenementId;
    }

    public Integer getNbPersonne() {
        return nbPersonne;
    }

    public void setNbPersonne(Integer nbPersonne) {
        this.nbPersonne = nbPersonne;
    }

    public String getAventureNom() {
        return aventureNom;
    }

    public void setAventureNom(String aventureNom) {
        this.aventureNom = aventureNom;
    }

    public Float getPrixUnitaireHt() {
        return prixUnitaireHt;
    }

    public void setPrixUnitaireHt(Float prixUnitaireHt) {
        this.prixUnitaireHt = prixUnitaireHt;
    }

    public Date getDateDebut() {
        return dateDebut;
    }

    public void setDateDebut(Date dateDebut) {
        this.dateDebut = dateDebut;
    }

    public Date getDateFin() {
        return dateFin;
    }

    public void setDateFin(Date dateFin) {
        this.dateFin = dateFin;
    }
}

    package com.wildadventures.mscommande.managers;

import com.wildadventures.mscommande.models.LignePanier;
import com.wildadventures.mscommande.models.Panier;
import com.wildadventures.mscommande.repositories.LignePanierRepository;
import com.wildadventures.mscommande.repositories.PanierRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;

@Component
public class PanierManager {

    @Autowired
    private PanierRepository panierRepository;

    @Autowired LignePanierRepository lignePanierRepository;

    /**
     * Ajoute une nouvelle ligne de panier au panier de l'utilisateur.
     */
    public void ajouterLignePanier(Panier panier, LignePanier lignePanier){

        panier.getLignesPanier().add(lignePanier);
        this.savePanier(panier);
    }

    /**
     * Enregistre le panier pour l'utilisateur ayant comme uuid clientUuid.
     *
     * @param panier le panier de l'utilisateur à créer
     *
     * @return le panier créé
     */
    private Panier savePanier(Panier panier){

        return panierRepository.saveAndFlush(panier);
    }

    /**
     * Récuperer un panier en fonction de son clientUuid
     *
     * @param clientUuid l'uuid du client
     *
     * @return le panier si il existe
     */
    public Panier recupererPanier(String clientUuid) {
        return this.panierRepository.findByClientUuid(clientUuid);
    }

    /**
     * Créer un nouveau panier pour l'utilisateur
     *
     * @param clientUuid l'uuid de l'utilisateur
     *
     * @return le panier créé
     */
    public Panier creerPanier(String clientUuid) {
        Panier panier = new Panier(clientUuid, new ArrayList<LignePanier>());
        return this.savePanier(panier);
    }
}

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

如果要将1-N单向关系建模为元素中的FK(而不是使用联接表),则可以添加

@JoinColumn

lignesPanier字段(如果不需要默认的JPA FK列命名,则可以选择定义FK列的名称)。按照these docs

由于您没有定义自己的架构,因此无需添加更多内容