Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Aiuto su relazioni in Spring Boot

    ciao!

    sto cercando visualizzare i dati con join tra tabelle.
    ho una tabella utenti:
    • id
    • email
    • password


    una tabella attivita:
    • a_id
    • a_utente
    • a_descrizione


    ogni utente può avere N attività.
    ogni attività può essere solo di un utente.

    queste le due classi:
    codice:
    import javax.persistence.*;
    import java.util.List;
    
    @Entity
    @Table(name = "utenti")
    public class Utente {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
    
        private String email;
        private String password;
    
        @OneToMany(mappedBy = "utente")
        private List<Attivita> attivita;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        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;
        }
    }
    e attivita:
    codice:
    import javax.persistence.*;
    
    @Entity
    @Table(name = "attivita")
    public class Attivita {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
    
        @ManyToOne
        @JoinColumn(name = "a_utente")
        private Utente utente;
    
        @Column(name = "a_attivita")
        private String descrizione;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public Utente getUtente() {
            return utente;
        }
    
        public void setUtente(Utente utente) {
            this.utente = utente;
        }
    
        public String getDescrizione() {
            return descrizione;
        }
    
        public void setDescrizione(String descrizione) {
            this.descrizione = descrizione;
        }
    }
    a questo punto vorrei aggiungere le attività nella risposta json del controller utente.
    ma qui mi perdo:
    codice:
    import com.mp.springtest.model.Utente;
    import com.mp.springtest.model.UtentiRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    import java.util.Optional;
    
    @RestController
    @RequestMapping(path = "/utenti")
    public class UtentiController {
    
        @Autowired
        private UtentiRepository utentiRepository;
    
        @GetMapping(path = "/all")
        public @ResponseBody
        List<Utente> getAll() {
            return utentiRepository.findAll();
        }
    
        @GetMapping(path = "/utente/{utenteId}")
        public @ResponseBody
        Optional<Utente> getById(@PathVariable Integer utenteId) {
            return utentiRepository.findById(utenteId);
        }
    
    }
    Ultima modifica di LeleFT; 10-12-2021 a 14:40

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Qual è il dubbio/problema?
    A prima vista non vedo errori. L'unica cosa che potresti aggiungere (vedi tu se è il caso) è il fetch EAGER nella relazione OneToMany, in modo da fargli leggere forzatamente anche tutte le attività collegate quando va a leggere l'utente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Qual è il dubbio/problema?
    A prima vista non vedo errori. L'unica cosa che potresti aggiungere (vedi tu se è il caso) è il fetch EAGER nella relazione OneToMany, in modo da fargli leggere forzatamente anche tutte le attività collegate quando va a leggere l'utente.


    Ciao.
    ciao!

    eh, è quello che mi seriverebbe.
    cioè, vorrei che nel json comparissero anche le attività legate all'utente.
    al momento invece non compaiono.

    se ho capito bene dovrei fare così:
    codice:
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "utente")
    private List<Attivita> attivita;

  4. #4
    ciao!

    ho provato ma sinceramente non ho capito.
    nel senso che come risultato continuo ad avere questo:

    codice:
    $ curl localhost:8080/utenti/utente/1
    {"id":1,"email":"a@a.it","password":"pwd"}
    in sostanza non vedo le attività nel json!

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Mancano il getter e il setter per la lista delle attività nell'entity Utente. Il JSON espone solo le proprietà "pubbliche" (cioè quelle per le quali esiste un getter!).
    Non ci avevo fatto caso prima.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    ciao!

    allora ho aggiunto i get/set come è giusto che sia:
    codice:
    package com.mp.springtest.model;
    
    import javax.persistence.*;
    import java.util.List;
    
    @Entity
    @Table(name = "utenti")
    public class Utente {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
    
        private String email;
        private String password;
    
        @OneToMany(fetch = FetchType.EAGER, mappedBy = "utente")
        private List<Attivita> attivita;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        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<Attivita> getAttivita() {
            return attivita;
        }
    
        public void setAttivita(List<Attivita> attivita) {
            this.attivita = attivita;
        }
    }
    però adesso facendo così l'output json è "assurdo"; neanche lo posto perchè diventa enorme anche se ho solo 2 records.
    e mi da questo errore:
    codice:
    2021-12-17 16:44:28.498  WARN 3424 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException]
    
    java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
        at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:472) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
        at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.sendServerError(DefaultHandlerExceptionResolver.java:552) ~[spring-webmvc-5.3.13.jar:5.3.13]
        at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotWritable(DefaultHandlerExceptionResolver.java:442) ~[spring-webmvc-5.3.13.jar:5.3.13]
        at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.doResolveException(DefaultHandlerExceptionResolver.java:209) ~[spring-webmvc-5.3.13.jar:5.3.13]
        at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:142) ~[spring-webmvc-5.3.13.jar:5.3.13]
        at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80) ~[spring-webmvc-5.3.13.jar:5.3.13]
        at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1327) ~[spring-webmvc-5.3.13.jar:5.3.13]
    ................................................................

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Così è difficile capire.
    Lo stackTrace non mostra riferimenti a codice tuo.
    Viene sollevata un'eccezione che tenta di andare a scrivere nella response dopo che questa è già stata inviata al client.
    Puoi postare il codice completo del rest service?
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    ciao!

    allora posto tutto.

    model utente:
    codice:
    package com.mp.springtest.model;
    
    import javax.persistence.*;
    import java.util.List;
    
    @Entity
    @Table(name = "utenti")
    public class Utente {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
    
        private String email;
        private String password;
    
        @OneToMany(fetch = FetchType.EAGER, mappedBy = "utente")
        private List<Attivita> attivita;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        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<Attivita> getAttivita() {
            return attivita;
        }
    
        public void setAttivita(List<Attivita> attivita) {
            this.attivita = attivita;
        }
    }
    model attività:
    codice:
    package com.mp.springtest.model;
    
    import javax.persistence.*;
    
    @Entity
    @Table(name = "attivita")
    public class Attivita {
    
        @Id
        @Column(name = "a_id")
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;
    
        @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
        @JoinColumn(name = "a_utente")
        private Utente utente;
    
        @Column(name = "a_descrizione")
        private String descrizione;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public Utente getUtente() {
            return utente;
        }
    
        public void setUtente(Utente utente) {
            this.utente = utente;
        }
    
        public String getDescrizione() {
            return descrizione;
        }
    
        public void setDescrizione(String descrizione) {
            this.descrizione = descrizione;
        }
    }
    repository utente:
    codice:
    package com.mp.springtest.model;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface UtentiRepository extends JpaRepository<Utente, Integer> {
    }
    repository attivita (che cmq per adesso non sto usando):
    codice:
    package com.mp.springtest.model;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface AttivitaRepository extends JpaRepository<Attivita, Integer> {
    }
    controller utente (unico controller che ho al momento):
    codice:
    package com.mp.springtest.controller;
    
    import com.mp.springtest.model.Utente;
    import com.mp.springtest.model.UtentiRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    import java.util.Optional;
    
    @RestController
    @RequestMapping(path = "/utenti")
    public class UtentiController {
    
        @Autowired
        private UtentiRepository utentiRepository;
    
        @PostMapping(path = "/add")
        public @ResponseBody
        String add(@RequestParam String email, @RequestParam String password) {
    
            Utente u = new Utente();
            u.setEmail(email);
            u.setPassword(password);
            utentiRepository.save(u);
    
            return "OK";
        }
    
        @GetMapping(path = "/")
        public @ResponseBody
        List<Utente> getAll() {
            return utentiRepository.findAll();
        }
    
        @GetMapping(path = "/{utenteId}")
        public @ResponseBody
        Optional<Utente> getById(@PathVariable Integer utenteId) {
            return utentiRepository.findById(utenteId);
        }
    
    }
    infine il main:
    codice:
    package com.mp.springtest;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SpringtestApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringtestApplication.class, args);
        }
    
    }

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ad occhio non vedo niente che non vada.
    Qual è la chiamata che ti solleva l'eccezione?

    PS: noto che precedentemente dicevi di invocarlo così:

    codice:
    $ curl localhost:8080/utenti/utente/1

    Ma nel controller non hai quel mapping (per ottenere i dati di un utente specifico hai un mapping
    /utenti/{utenteId} ).
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Ad occhio non vedo niente che non vada.
    Qual è la chiamata che ti solleva l'eccezione?

    PS: noto che precedentemente dicevi di invocarlo così:

    codice:
    $ curl localhost:8080/utenti/utente/1

    Ma nel controller non hai quel mapping (per ottenere i dati di un utente specifico hai un mapping
    /utenti/{utenteId} ).
    eh si l'ho cambiato.
    cmq quello "corretto" è questo, ma che solleva l'eccezione:
    codice:
    curl localhost:8080/utenti/1
    questo l'output: https://pastebin.com/RuxeddzZ

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.