2013-01-16 13 views
29

Ho un progetto Spring per una piccola app Web impostata in Intellij IDEA.Intellij IDEA: specifica l'origine dati per la convalida JPA

Usa JPA sopra Hibernate per il livello di persistenza. L'origine dati (MySQL) è definito nel contesto di applicazione Spring:

<!-- Values are configured via the property override --> 
    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" > 
     <property name="driverClassName" value=""/> 
     <property name="url" value=""/> 
     <property name="username" value=""/> 
     <property name="password" value=""/> 
    </bean> 

il valore effettivo vengono letti da un file di proprietà e iniettato in fase di esecuzione Spring utilizzando il meccanismo di struttura-override.

E poi l'origine dati viene iniettato nella fabbrica di un'entità responsabile nello stesso contesto di applicazione:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="myDataSource"/> 
    </bean> 

Infine, il gestore di entità iniettato nel DAO con un'annotazione:

/** 
* Shared, thread-safe proxy for the actual transactional EntityManager 
*/ 
@PersistenceContext 
private EntityManager em; 

tutto funziona bene quando lo costruisco e lo distribuisco a Tomcat, ma la convalida JPA di Intellij non sembra capire da dove ottenere l'origine dati.

Nei miei entità, nomi e le colonne dei tavoli nomi sono sottolineati in rosso e il messaggio di convalida è 'non può risolvere da tavolo' o 'non può risolvere colonna':

@Entity 
@Table(name = "domain") 
public class Domain extends AbstractAgendaEntity { 

Int questo esempio, è il "domain" parte che non è considerata valida.

Ho configurato manualmente il mio database nella finestra degli strumenti "Database", posso vedere le mie tabelle ed eseguire query SQL nella console.

Come posso dire a Intellij di utilizzare questa origine dati per risolvere i nomi delle tabelle per le mie entità JPA?

risposta

84

Ho finalmente scoperto come farlo.

La chiave è la finestra degli strumenti "persistenza". Apparentemente è reso disponibile dopo aver aggiunto il facet JPA, ma è una finestra degli strumenti separata.

per aprirla: menu "Visualizza" -> finestre degli strumenti -> Persistenza

In questa finestra si vede l'applicazione con i diversi elementi relativi persistenza (vedo persistence.xml, entityManagerFactory dal contesto primavera, e myUnit che ho non so da dove viene

Qui puoi fare clic con il pulsante destro del mouse su qualsiasi elemento e scegliere "Assegna origine dati".

Apre una finestra di dialogo con una piccola tabella contenente gli elementi di persistenza sulla colonna sinistra e l'origine dati assegnata ad essa sulla colonna di destra. Puoi assegnare un'origine dati dalla finestra "Database" lì, quindi ho scelto l'origine dati che avevo configurato per il mio DB MySQL e voilà, gli errori di validazione sono andati via.

Ma se inserisco una tabella o un nome di colonna errati, ricevo comunque un errore, che è piuttosto accurato.

+9

Per coloro che sono ignoranti come I ... È possibile accedere alla finestra dello strumento di persistenza selezionando: Visualizza | Tool Windows | Persistenza. – kc2001

+0

Per IDEA 10, la finestra si trova in: Finestra | Tool Windows | Persistenza. –

+1

Grande. Finalmente un IDE che fa quello che deve fare (invece di appendere, avere la funzionalità di base buggy, ecc.). Si può facilmente configurarlo per far sì che le keymap di E ****** passino senza intoppi dal tuo ambiente aziendale. – Kawu

0

Assicurarsi di importare javax.persistence.Table e javax.persistence.Column all'interno delle classi di entità.

Così nella parte superiore di ogni controllo classe per:

import javax.persistence.Table; 
import javax.persistence.Column; 

Questo consente di importare le annotazioni appropriate JPA nella tua classe.

+0

Hai frainteso il problema. L'annotazione viene riconosciuta e il codice viene compilato, ma la convalida JPA aggiuntiva fornita da Intellij non riesce a trovare la tabella nel database MySQL. –

+0

@PierreHenry Ci scusiamo. Grazie per il chiarimento. Stai specificando un elemento nome sull'annotazione di tabelle e colonne? In caso contrario, potrebbero non essere mappati correttamente a seconda dell'involucro dei nomi di entità/tabella –

+0

Sì, ho un @Table con un nome (ho modificato la domanda con una mappatura di entità campione). Il nome stesso non è il problema da quando eseguire l'app funziona. Il problema è che Intellij non sa dove cercare il tavolo ... –

11

Per prima cosa è necessario aggiungere l'origine dati all'IDE. Puoi farlo nella scheda "Database" di solito sul lato destro. È possibile importare questa origine dati dal proprio codice. Dovresti assicurarti di premere le tabelle di aggiornamento dei pulsanti. IDEA caricherà le tabelle e le utilizzerà per la convalida. Quindi devi inserire nella tua sfaccettatura JPA questa fonte di dati.

+0

Grazie, ma come Lo faccio ? Ho già configurato l'origine dati nella finestra degli strumenti "database", ma non vedo come posso collegarmi ad essa nella configurazione della faccetta JPA? –

+1

Non importa, ho trovato la soluzione (vedi la mia risposta) –

+0

Ah vedo la tua risposta. Caratteristica piuttosto nascosta :) Questo "assegna" si usa in faccette JPA e Hibernate. – chalimartines

5

Ci sono alcune cose che devi fare. Innanzitutto, configura un faccetto Hibernate nella configurazione della struttura del progetto. Puoi selezionare il tuo file di configurazione di Hibernate a questo punto o crearne uno nuovo. Dovresti quindi configurare le tue origini dati nella finestra Database (Visualizza-> Strumenti Finestra-> Database). Ricordarsi di impostare il dialetto del database nella scheda Console nella finestra del database. Infine, è necessario andare alla finestra Persistenza (Visualizza-> Finestra Strumenti-> Persistenza) e aggiungere un'origine dati al facet appropriato. Basta fare clic destro sull'icona a destra nell'albero e selezionare "Aggiungi origine dati". La colonna Origine dati contiene un menu a discesa contenente tutte le origini dati che sono state configurate. IntelliJ identifica correttamente le tabelle.

Una parola di avvertimento. A partire dalla versione 12.04, IntelliJ non modifica il file di configurazione di Hibernate. Hai ancora bisogno di mappare le tue classi e aggiungere manualmente i dettagli del tuo database.

+0

potrebbe essere chiaro in ogni caso, ma un Facet JPA può anche fare il trucco – user2039709

1

In cima a impostare una fonte di dati, come altri hanno detto, al fine di cancellare questi falsi errori, nel pannello Database, ho dovuto andare alle impostazioni, schemi scheda & tabelle, e ha colpito la casella sinistra del "information_schema "tabella per il mio database.

+0

Questa è stata la cruciale informazione aggiuntiva di cui avevo bisogno in IDEA 15.0.4 – Mark

+0

Su intellij 2017 ora. "Aggiorna tabelle" non funziona più, né questa è la risposta .. Penso che intellij abbia solo bug in questo senso. Non riconosce il nome della mia tabella/nomi di colonne chiave univoche non importa quello che faccio. – Amalgovinus

0

Ho avuto l'origine dati impostata correttamente, ma i nomi delle colonne non sono stati mostrati. Dopo aver modificato lo schema e il catalogo come di seguito, tutto è stato riconosciuto correttamente.

@Entity 
@Table(name = "stock_detail", schema = "testing", catalog = "") 
public class Xyz { 
    // ... 
0

Per JPA non è possibile risolvere tabella/colonna. Se tutto funziona e hai appena infastidito dal segno di errore rosso, puoi modificare le impostazioni di ispezione da Errore a Avviso: -

File --> Settings --> Inspections --> JPA issues --> Unresolved database references in annotations.