giannino1995 ha scritto:
Sto studiando questa applicazione:
https://github.com/Apress/beg-spring-boot-2/tree/master/chapter-08/springboot-multiple-datasources-demo
Ogni giorno sono in trepidante attesa .... "cosa chiederà oggi giannino1995?"
giannino1995 ha scritto:
Domanda 1
Non capisco alla perfezione perché nelle @Entity a volte si trova il costruttore vuoto e a volte no. Quando devo metterlo e quando no? Nel dubbio Posso inserirlo sempre?
Le classi @Entity devono sempre avere un costruttore "no-arg" (senza argomenti), perché la classe la deve poter istanziare
anche il ORM tramite reflection quando "tira su" dati dal db.
Ora, dovresti ben sapere che se il programmatore non scrive alcun costruttore esplicito in una classe, il compilatore inserisce il costruttore di
default che è appunto senza argomenti. Se il programmatore invece scrive almeno un costruttore esplicito, il compilatore NON inserisce il costruttore di
default. Concetto non base ... SUPER-base di Java.
In quel progetto, la classe User ha anche altri costruttori espliciti utili al progetto, quindi un costruttore esplicito senza argomenti ci vuole. In Address invece il costruttore di default generato dal compilatore è sufficiente.
giannino1995 ha scritto:
Domanda 2
L'applicazione fallisce dandomi questo avviso:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ordersEntityManagerFactory' defined in class path resource [com/apress/demo/config/OrdersDBConfig.class]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
Sembra che ci sia un errore in OrdersDBConfig.class ma non saprei dove mettere le mani. Dove/come si è procurata la classe di configurazione l'autore del libro?
No, non c'entra niente OrdersDBConfig e nemmeno Spring Boot in generale.
Stai usando un JDK 11 o superiore (es. JDK 14)?? La API JAXB (per il binding classi<->XML) è stata rimossa dal framework da Java 11.
Usa JDK 8. Oppure prova ad usare Spring Boot 2.2.6+ che dichiara il supporto di Java 14.
giannino1995 ha scritto:
L'unica modifica che ho fatto è questa:
// import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.jdbc.DataSourceBuilder;
In pratica in Spring Boot 2.0.0 il pacchetto DataSourceBuilder è stato spostato rispetto a Spring Boot 1.5.
Sì, in effetti la classe è stata spostata. Ma in Spring Boot 2 è anche diventata "generica", ovvero DataSourceBuilder<T extends DataSource>
Quindi va fatta una modifica in OrdersDBConfig.java
E SecurityDBConfig.java per cambiare l'import (svista dell'autore, sicuramente).
giannino1995 ha scritto:
L'applicazione parte e renderizza la vista ma è vuota come le tabelle del DBMS. In MySQL ci sono le tabelle ma sono prive di record.
Con H2 falliscono anche tutti i test come in MySQL.
Nei file .sql gli 'id' vengono assegnati dall'autore del file quando in realtà dovrebbe fare Hibernate: è lecito?
Ho provato a rimuovere tutti gli id dai file .sql ma non ho risolto. In questa esercitazione vorrei poter caricare i record da file .sql senza dover procedere manualmente oppure usando Java. E' possibile? Come potrei fare?
Insomma se all'autore tutto funziona alla perfezione perché a me da problemi. Dopo 3 anni uno script in Spring Boot + JPA è già da buttare?
Fatte quelle 2 modifiche per il package di DataSourceBuilder, lanciando mvn test (nota: JDK 8 ) i 2 test che usano H2 passano benissimo con successo. Lanciando mvn spring-boot:run (che usa ancora H2) la pagina funziona correttamente e mostra users e orders.
Con MySQL non ho ancora provato, provo più tardi.