我的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);
}
}
感谢您的回答。
答案 0 :(得分:0)
如果要将1-N单向关系建模为元素中的FK(而不是使用联接表),则可以添加
@JoinColumn
到lignesPanier
字段(如果不需要默认的JPA FK列命名,则可以选择定义FK列的名称)。按照these docs。
由于您没有定义自己的架构,因此无需添加更多内容