Pierre Henry Pierre Henry - 6 months ago 131
Java Question

Intellij IDEA: specify datasource for JPA validation

I have a Spring project for a small web app set up in Intellij IDEA.

It uses JPA on top of Hibernate for the persistence layer. The datasource (MySQL) is defined in Spring application context :

<!-- 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>


The actual value are read from a properties file and injected at runtime by Spring using the property-override mechanism.

And then the datasource is injected into the entity manager factory in the same application context:

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


Finally the entity manager injected into the DAOs using an annotation:

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


It all works fine when I build and deploy it to Tomcat, but Intellij's JPA validation doesn't seem to understand where to get the datasource from.

In my entities, the tables' names and columns' names are underlined in red and the validation message is "cannot resolve table" or "cannot resolve column":

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


Int this example, it's the
"domain"
part that is not considered valid.

I have manually configured my database in the "Database" tool window, I can see my tables and perform SQL queries in the console.

How can I tell Intellij to use this datasource to resolve table names for my JPA entities?

Answer

I finally found out how to do this.

The key is the "persistence" tool window. Apparently it is made available after you add the JPA facet, but is a separate tool window.

To open it : menu "view" -> Tool Windows -> Persistence

In this window you see your application with the different persistence related elements (I see persistence.xml, entityManagerFactory from Spring context, and myUnit which I don't know where it comes from.

Here you can right-click on any element and choose "Assign data source".

This opens a pop-up dialog with a small table containing you persistence elements on the left column and the data source assigned to it on the right column. You can assign a datasource from the "Database" window in there, so I picked the datasource I had configured for my MySQL DB and voilà, the validation errors went away.

But if I enter a wrong table or column name, I still get an error, which is pretty neat.