Intellij IDEA:为 JPA 验证指定数据源
Posted
技术标签:
【中文标题】Intellij IDEA:为 JPA 验证指定数据源【英文标题】:Intellij IDEA: specify datasource for JPA validation 【发布时间】:2012-12-30 15:19:23 【问题描述】:我有一个在 Intellij IDEA 中设置的小型 Web 应用程序的 Spring 项目。
它在 Hibernate 之上使用 JPA 作为持久层。数据源(mysql)在 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>
实际值从属性文件中读取,并在运行时由 Spring 使用属性覆盖机制注入。
然后将数据源注入到同一个应用上下文中的实体管理器工厂中:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="myDataSource"/>
</bean>
最后,实体管理器使用注解注入 DAO:
/**
* Shared, thread-safe proxy for the actual transactional EntityManager
*/
@PersistenceContext
private EntityManager em;
当我构建并将其部署到 Tomcat 时一切正常,但 Intellij 的 JPA 验证似乎不了解从何处获取数据源。
在我的实体中,表名和列名都带有红色下划线,验证消息是“无法解析表”或“无法解析列”:
@Entity
@Table(name = "domain")
public class Domain extends AbstractAgendaEntity
在此示例中,"domain"
部分被视为无效。
我已经在“数据库”工具窗口中手动配置了我的数据库,我可以在控制台中查看我的表并执行 SQL 查询。
如何告诉 Intellij 使用此数据源来解析我的 JPA 实体的表名?
【问题讨论】:
【参考方案1】:我终于知道如何做到这一点了。
关键是“持久性”工具窗口。显然,它在您添加 JPA 方面后可用,但它是一个单独的工具窗口。
打开它:菜单“视图”->工具窗口->持久性
在此窗口中,您可以看到具有不同持久性相关元素的应用程序(我从 Spring 上下文中看到 persistence.xml
、entityManagerFactory
和我不知道它来自哪里的 myUnit
。
您可以在此处右键单击任何元素并选择“分配数据源”。
这将打开一个弹出对话框,其中包含一个小表格,其中左列包含持久性元素,右列包含分配给它的数据源。您可以从那里的“数据库”窗口分配数据源,因此我选择了为 MySQL DB 配置的数据源,瞧,验证错误消失了。
但如果我输入了错误的表或列名,我仍然会收到错误,这非常简洁。
【讨论】:
对于那些像我一样无知的人......您可以通过选择进入持久性工具窗口:查看|工具窗口 |持久性。 对于 IDEA 10,窗口位于:Window |工具窗口 |持久性。 太棒了。最后一个 IDE 可以完成它应该做的事情(而不是挂起,具有错误的基本功能等)。您可以轻松地将其配置为具有 E****** 键盘映射,以便从您的实体环境顺利过渡。 这几乎为我完成了,除了我还必须进入 Facets -> JPA -> Data Sources Mapping 并将 Persistence Unit 映射到数据源。 在“分配数据源”窗口中看到一个条目之前,我必须添加一个 Spring facet 并手动将我的 @Entity 类添加到 Spring 应用程序上下文中。【参考方案2】:首先必须将数据源添加到 IDE 中。您通常可以在右侧的“数据库”选项卡中执行此操作。您可以从代码中导入此数据源。您应该确保点击按钮刷新表格。 IDEA 将加载表并使用它们进行验证。然后你必须在你的 JPA 方面设置这个数据源。
【讨论】:
谢谢,但我该怎么做呢?我已经在“数据库”工具窗口中配置了数据源,但是我看不到如何在 JPA 方面配置中链接到它? 啊,我看到你的答案了。非常隐藏的功能:) 这个“分配”用于 JPA 和 Hibernate 方面。 “刷新表格”很重要【参考方案3】:您需要做一些事情。首先,在您的项目结构配置中配置一个 Hibernate 方面。此时您可以选择您的 Hibernate 配置文件或创建一个新配置文件。然后您应该在数据库窗口(视图->工具窗口->数据库)中配置您的数据源。请记住在数据库窗口的“控制台”选项卡上设置数据库方言。最后,您需要转到 Persistence 窗口(View->Tools Window->Persistence)并将数据源添加到适当的方面。只需右键单击树中的右侧图标并选择“添加数据源”。数据源列有一个下拉菜单,其中包含您配置的所有数据源。 IntelliJ 然后正确识别表。
一句警告。从 v12.04 开始,IntelliJ 不会修改您的 Hibernate 配置文件。您仍然需要映射您的类并手动添加您的数据库详细信息。
【讨论】:
无论如何可能很清楚,但 JPA Facet 也可以解决问题【参考方案4】:对于 JPA 无法解析表/列。如果一切正常,而您只是对红色错误标记感到恼火,您可以将检查设置从错误更改为警告:-
File --> Settings --> Inspections --> JPA issues --> Unresolved database references in annotations
.
【讨论】:
【参考方案5】:除了像其他人提到的那样设置数据源之外,为了清除这些错误错误,在“数据库”面板中,我必须转到“设置”、“模式和表”选项卡,然后点击“信息模式”左侧的复选框我的数据库的表。
【讨论】:
这是我在 IDEA 15.0.4 中需要的关键附加信息 现在在 intellij 2017 上。 “刷新表格”不再起作用,这个答案也不再起作用。我认为 intellij 在这方面存在错误。无论我做什么,它都无法识别我的表名/唯一键列名。【参考方案6】:确保在实体类中导入 javax.persistence.Table
和 javax.persistence.Column
。
所以在每个类的顶部检查:
import javax.persistence.Table;
import javax.persistence.Column;
这会将正确的 JPA 注释导入您的类。
【讨论】:
你误解了这个问题。注解被识别,代码编译,但是Intellij提供的额外JPA验证在MySQL数据库中找不到表。 @PierreHenry 抱歉。感谢您的澄清。您是否在表和列注释上指定名称元素?如果不是,它们可能无法正确映射,具体取决于您的实体/表名称的大小写 是的,我有一个带有名称的@Table(我使用示例实体映射编辑了问题。)名称本身不是问题,因为当我运行应用程序时它可以工作。问题是 Intellij 不知道在哪里寻找表格...... @PierreHenry 您是否将项目设置为 JPA? 是的。它有一个 JPA 方面,描述符指向 resources/META-INF 文件夹中的我的 persistence.xml,但该文件不包含数据源参数。【参考方案7】:我正确设置了数据源,但未显示列名。在我像下面这样更改架构和目录后,一切都被正确识别了。
@Entity
@Table(name = "stock_detail", schema = "testing", catalog = "")
public class Xyz
// ...
【讨论】:
【参考方案8】:因为路径因您的想法版本而异。所以从 File --> Settings 只搜索: Unresolved database references。然后做任何你认为没问题的事情:取消选中验证或更改严重性标志。
【讨论】:
【参考方案9】:将鼠标光标停留在表名上一会儿,将出现上下文菜单,您可以在其中分配数据源。
【讨论】:
以上是关于Intellij IDEA:为 JPA 验证指定数据源的主要内容,如果未能解决你的问题,请参考以下文章
IntelliJ IDEA 2017版 spring-boot2.0.2 搭建 JPA springboot DataSource JPA sort排序方法使用方式, 添加关联表的 order by
在 Intellij IDEA 14 上更改远程存储库凭据(身份验证)
IntelliJ IDEA 常用设置 - Maven 的安装与使用
IntelliJ IDEA 常用设置 - Maven 的安装与使用