Si penso sia questo il punto. Infatti alla prima creazione della tabella, i prodotti relativi al fornitore con l'ID=1, vengono rilevatiIl punto è che la lista dei prodotti ha il FetchType.LAZY. Pertanto puoi accedere alla lista solo nell'arco di tempo in cui il persistence context è attivo.
Se hai fatto un service con un metodo con @Transactional(readOnly=true) per leggere i fornitori, il persistence context è attivo solo lì dentro. Se l'accesso alla lista dei prodotti è fatto SOLO ad un livello più alto (controller/vista), il ORM non applica la lettura in modo lazy perché sei fuori dal persistence context.
La soluzione banale: fai un get della lista nel metodo del service, questo fa attivare il meccanismo lazy della lettura.
Un'altra soluzione più architetturale è quella di NON esporre mai gli oggetti delle entity al controller/vista ma fornire degli oggetto DTO di passaggio che sono eventualmente più focalizzati sul modello della vista.
]
Ma non capisco come risolvere...
Non ho usato l'annotazione @Transactional, ho aggiunto questo(ma come dicevo funziona solo quando il db è appena rigenerato):
codice:@Override public List<Prodotto> getAllProdotti(Long id) { return getFornitoreById(id).getProdotti(); }