web-dev-qa-db-fra.com

Intellij IDEA: spécifie la source de données pour la validation JPA

J'ai un projet de printemps pour une petite application Web configurée dans Intellij IDEA.

Il utilise JPA au-dessus de Hibernate pour la couche de persistance. La source de données (MySQL) est définie dans le contexte d'application 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>

Les valeurs réelles sont lues à partir d'un fichier de propriétés et injectées lors de l'exécution par Spring à l'aide du mécanisme de substitution de propriété.

Et puis la source de données est injectée dans la fabrique de gestionnaires d’entités dans le même contexte d’application:

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

Enfin, le gestionnaire d’entités a injecté dans les DAO en utilisant une annotation:

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

Tout fonctionne bien lorsque je le construis et le déploie sur Tomcat, mais la validation JPA d’Intellij ne semble pas comprendre où obtenir la source de données. 

Dans mes entités, les noms des tables et des colonnes sont soulignés en rouge et le message de validation est "ne peut pas résoudre une table" ou "ne peut pas résoudre une colonne":

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

Dans cet exemple, c'est la partie "domain" qui n'est pas considérée comme valide.

J'ai configuré manuellement ma base de données dans la fenêtre "Base de données", je peux voir mes tables et effectuer des requêtes SQL dans la console.

Comment puis-je dire à Intellij d'utiliser cette source de données pour résoudre les noms de table de mes entités JPA?

35
Pierre Henry

J'ai finalement découvert comment faire cela.

La clé est la fenêtre de l'outil "persistance". Apparemment, il est disponible après l'ajout de la facette JPA, mais constitue une fenêtre d'outil séparée.

Pour l'ouvrir: menu "vue" -> Fenêtre outil -> Persistance

Dans cette fenêtre, vous voyez votre application avec les différents éléments liés à la persistance (je vois persistence.xml, entityManagerFactory du contexte Spring et myUnit dont je ne sais pas d'où il provient.

Ici, vous pouvez cliquer avec le bouton droit sur n’importe quel élément et choisir "Attribuer une source de données" .  enter image description here

Cela ouvre une boîte de dialogue contenant une petite table contenant vos éléments de persistance dans la colonne de gauche et la source de données qui lui est affectée dans la colonne de droite. Vous pouvez assigner une source de données à partir de la fenêtre "Base de données", j'ai donc choisi la source de données que j'avais configurée pour ma base de données MySQL et voilà, les erreurs de validation ont disparu.

Mais si j'entre un nom de table ou de colonne incorrect, j'obtiens toujours une erreur, ce qui est plutôt bien.

102
Pierre Henry

La première chose que vous devez ajouter une source de données dans votre IDE. Vous pouvez le faire dans l'onglet "Base de données" généralement à droite. Vous pouvez importer cette source de données à partir de votre code. Vous devez vous assurer que vous cliquez sur les tables de rafraîchissement des boutons. IDEA chargera les tables et les utilisera pour la validation. Ensuite, vous devez configurer votre source de données dans la facette JPA.

12
chalimartines

Il y a quelques choses que vous devez faire. Commencez par configurer une facette Hibernate dans la configuration de votre structure de projet. Vous pouvez sélectionner votre fichier de configuration Hibernate à ce stade ou en créer un nouveau. Vous devez ensuite configurer vos sources de données dans la fenêtre Base de données (Affichage-> Fenêtre Outils-> Base de données). N'oubliez pas de définir le dialecte de la base de données sous l'onglet Console de la fenêtre de la base de données. Enfin, vous devez accéder à la fenêtre Persistence (Affichage-> Fenêtre Outils-> Persistance) et ajouter une source de données à la facette appropriée. Faites un clic droit sur l'icône de droite dans l'arborescence et sélectionnez "Ajouter une source de données". La colonne Source de données contient un menu déroulant contenant toutes les sources de données que vous avez configurées. IntelliJ identifie ensuite correctement les tables.

Un mot d'avertissement. À partir de la version 12.04, IntelliJ ne modifie pas votre fichier de configuration Hibernate. Vous devez toujours mapper vos classes et ajouter manuellement les détails de votre base de données.

5
David Weber

En plus de définir une source de données comme d'autres l'ont mentionné, afin de supprimer ces fausses erreurs, dans le panneau Base de données, je devais accéder aux paramètres, à l'onglet Schémas et Tables, puis cocher la case à gauche de la table "information_schema" pour mon base de données.

1
Amalgovinus

Pour JPA ne peut pas résoudre table/colonne. Si tout fonctionne et que le repère d'erreur rouge vous gêne, vous pouvez modifier les paramètres d'inspection de Erreur à Avertissement: - 

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

0
justMe

La source de données était correctement définie, mais les noms de colonne n'étaient pas affichés. Après avoir changé le schéma et le catalogue comme ci-dessous, tout a été reconnu correctement.

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

Assurez-vous d'importer javax.persistence.Table et javax.persistence.Column au sein de vos classes d'entité.

Donc, en haut de chaque classe, vérifiez:

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

Cela importera les annotations JPA appropriées dans votre classe.

0
Kevin Bowersox