È possibile fare in modo che l'applicazione Spring Boot JPA Hibernate crei automaticamente tabelle con le colonne e le relazioni necessarie dalle entità JPA?

Aug 24 2020

Sono un principiante che conosce solo le basi di Java Core. Ho un'attività di test in cui devo creare un semplice servizio Web REST con Spring Boot.

Ho scritto tutta la logica in Java Core e ora provo a inserirla in tutte queste tecnologie.

Sto usando questa guida:

https://spring.io/guides/tutorials/rest/

Qui hanno entità JPA e annotazione @Table, dove è specificato il nome della tabella, ma non ci sono script SQL per creare tabelle in questa guida.

Quindi ho pensato che JPA creerà database e tabelle per le entità da solo, ma quando descommento l'annotazione @Table dice "Impossibile risolvere la tabella '<table_name>'"

Sto usando IntelliJ IDEA con il progetto Spring Boot Maven con Spring Web, H2 e JPA importati (come dice la guida).

Ho anche configurato H2 Data Source e testato la connessione: funziona bene. C'è uno schema, ma nessuna tabella.

Ecco il mio application.properties:

spring.h2.console.enabled=true
spring.h2.console.path=/h2_console
spring.datasource.url=jdbc:h2:~/kaylemains
spring.datasource.platform=h2
spring.datasource.initialization-mode=always
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.generate-ddl=true
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto = update
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

Come nella guida, aggiungo entità nella classe LoadDatabase in questo modo:

@Bean
CommandLineRunner initTournaments(TournamentRepository repository) {

    return args -> {
        log.info("Preloading " + repository.save(new Tournament("Kayle Mains Competition: Summoner's Gorge", 16)));
    };
}

Quindi la mia domanda è: posso avere un database H2 memorizzato su file e fare tutto con esso (compresa la creazione di tabelle) dal mio codice Java?

OPPURE è necessario creare tabelle manualmente (scrivendo script SQL con CREATE TABLE) e costruirle in modo che tutte le entità funzionino correttamente? (ciò significa definire colonne di chiavi esterne ecc.), e solo dopo JPA sarà in grado di lavorare con questo database? Devo aggiungere l'annotazione @Column a ogni campo e JPA non lo farà da solo per le sue entità?

Perché ricevo questo errore di "Impossibile risolvere la tabella"? Ovviamente non può essere risolto perché non esiste ancora, ho pensato che JPA e Hibernate lo creeranno per me in base alle classi di entità ...

Risposte

3 SebaLópez Aug 24 2020 at 01:38

Qui a Baeldung hai tutte le informazioni sulle proprietà da generare ddl

Spring fornisce una proprietà specifica di JPA che Hibernate utilizza per la generazione di DDL: spring.jpa.hibernate.ddl-auto.

create – Hibernate elimina prima le tabelle esistenti, quindi crea nuove tabelle

update : il modello a oggetti creato in base alle mappature (annotazioni o XML) > viene confrontato con lo schema esistente, quindi Hibernate aggiorna lo schema > in base al diff. Non cancella mai le tabelle o le colonne esistenti anche se >non sono più richieste dall'applicazione

create-drop – simile a create, con l'aggiunta che Hibernate eliminerà >il database dopo che tutte le operazioni sono state completate. Tipicamente utilizzato per la convalida del test unitario: Hibernate convalida solo se le tabelle e le colonne esistono, altrimenti genera un'eccezione

none : questo valore disattiva effettivamente la generazione DDL

Dobbiamo impostare il valore con attenzione o utilizzare uno degli altri meccanismi per inizializzare il database.

Se il problema persiste, vai su Impostazioni -> Ispezioni e deseleziona l'opzione "Riferimenti database non risolti in annotazione"