Notazioni Spring e relazioni tra tabelle

di il
2 risposte

Notazioni Spring e relazioni tra tabelle

Salve a tutti, ho creato una piccola app per la gestione delle vendite utilizzando Spring e MySQL a scopo puramente didattico.

Non ho ancora ben capito come funzionano le relazioni tra le tabelle nella pratica, o meglio ho ancora difficoltà a impostare relazioni corrette.

Ho 3 model: Cliente, Ordine e Prodotto. Quello che voglio ottenere è che se cancello un prodotto o un cliente tutti gli ordini che contengono quel prodotto e/o quel cliente vengano automaticamente cancellati.

Allo stato attuale (potete vedere sotto i model), con le notazioni e i comandi utilizzati non riesco ad ottenere questo risultato: se infatti provo ad eliminare un cliente o un prodotto che appaiono in un ordine, Spring non me lo fa fare e mi spara la SQLIntegrityConstraintViolationException.

Come posso arrivare al mio obbiettivo (sempre che ciò sia sensato)?

Inoltre, dove posso imparare ad utilizzare bene notazioni e comandi relativi alle relazioni tra le tabelle? Su internet il materiale c'è ma è dispersivo.

Ultima curiosità: volendo scegliere tra raggiungere il risultato voluto tramite un'opportuna gestione delle relazioni tra le tabelle o tramite l'implementazione di una logica adatta direttamente codice, cosa è da preferire?

Grazie!
__________________________________________________________
public class Cliente {

@Id
@Column (name="\"Codice fiscale\"")
private String codicefiscale;
@Column (name="\"Nome cliente\"")
private String nome;
@Column (name="\"Cognome cliente\"")
private String cognome;
@Column (name="\"Città\"")
private String citta;
@OneToMany(cascade=CascadeType.ALL,orphanRemoval=true)
private List<Ordine> ordini = new ArrayList<>();

________________________________________________

public class Prodotto {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column (name="\"Codice prodotto\"")
private int codProd;
@Column (name="\"Nome prodotto\"")
private String nomeProd;
@Column (name ="\"Prezzo unitario (€)\"")
private Float prezzo;
@Column (name="\"Quantità disponibile\"")
private int qtaDisp;
@OneToMany (cascade=CascadeType.ALL,orphanRemoval=true)
private List<Ordine> ordini = new ArrayList<>();

_______________________________________________________

public class Ordine {

@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column (name="\"Codice ordine\"")
private int codOrd;
@ManyToOne //con @ManyToOne stabilisco il tipo di relazione tra le tabelle
@JoinColumn (name="\"Prodotto\"") //con @JoinColumn stabilisco che prodotto è FK sottesa alla relazione
private Prodotto prodotto;
@Column (name="\"Quantità\"")
private int quantita;
@Column (name="\"Importo (€)\"")
private Float importo;
@Column (name="\"Data ordine\"")
private Date dataOrdine;
@ManyToOne
@JoinColumn(name="\"Cliente\"")
private Cliente cliente;

2 Risposte

  • Re: Notazioni Spring e relazioni tra tabelle

    Frengo ha scritto:


    Salve a tutti, ho creato una piccola app per la gestione delle vendite utilizzando Spring e MySQL a scopo puramente didattico.

    Non ho ancora ben capito come funzionano le relazioni tra le tabelle nella pratica, o meglio ho ancora difficoltà a impostare relazioni corrette.
    Chiariamo una cosa: hai usato chiaramente JPA, come si evince dal codice. Ma JPA non è l'unica strada possibile, ci sono un sacco di altri modi per accedere con Java ad un DB relazionale. Quindi la prima questione sarebbe: ti serve davvero JPA? Per 3 tabelle in croce che hai?

    Frengo ha scritto:


    Inoltre, dove posso imparare ad utilizzare bene notazioni e comandi relativi alle relazioni tra le tabelle? Su internet il materiale c'è ma è dispersivo.
    Purtroppo JPA non è "facile". Ed è vero, su internet c'è vario materiale ma non è facile trovarlo e non è detto che sia omni-comprensivo. Ci sono però dei validi libri (in inglese) tipo quelli della Apress.

    Frengo ha scritto:


    Ultima curiosità: volendo scegliere tra raggiungere il risultato voluto tramite un'opportuna gestione delle relazioni tra le tabelle o tramite l'implementazione di una logica adatta direttamente codice, cosa è da preferire?
    Probabilmente ti stai domandando: "c'è un altro modo oltre a JPA?". Come ho già detto prima, sì certo, ce ne sono svariati.

    Frengo ha scritto:


    @Column (name="\"Codice prodotto\"")
    @Column (name="\"Nome prodotto\"")
    @Column (name ="\"Prezzo unitario (€)\"")
    Comunque, già mettere dei nomi "quotati" non è il massimo. Ma la cosa ancora peggiore è mettere dei nomi di colonne con spazi o caratteri particolari. Pertanto, NON dovresti mai mettere nomi di colonne (parlo proprio delle colonne fisiche della tabella) chiamate es "Prezzo unitario (€)".
  • Re: Notazioni Spring e relazioni tra tabelle

    Ciao andbin,

    Sì uso JPA perché è quella che mi è stata "insegnata" (forse dovrei utilizzare il termine "fatta vedere") nell'azienda che mi ha assunto dopo un corso Java. Al momento sono ancora in una fase di formazione post-assunzione, ma come immaginerai l'insegnamento non avviene in maniera organica e complessiva, ma puramente empirica, diretta sulla pratica del momento. Da qui la totale assenza di uno sguardo globale da parte mia.

    Felice di sapere che esiste qualcosa di alternativo a JPA ma...dove trovo una trattazione di queste alternative, delle loro linee generali, della differenza che intercorre tra di esse e dei motivi per preferire l'una o l'altra?
Devi accedere o registrarti per scrivere nel forum
2 risposte