java - Intellij 抛出 java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey 但使用 maven 运行
问题描述
我正在尝试测试一小段代码,以查看是否可以使用休眠连接到本地数据库并创建一些表并插入数据。
package service;
import model.CategoryEntry;
import model.SubCategoryEntry;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class DatabaseConnectionTest {
@Test
public void databaseConnectionIsSuccessful() {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
CategoryEntry categoryEntry = new CategoryEntry();
categoryEntry.setId(2269);
categoryEntry.setAlert(false);
categoryEntry.setLabel("Eat and Drink");
categoryEntry.setSlug("eat-drink");
List<CategoryEntry> subcategories = new ArrayList<>();
CategoryEntry subCategoryEntry1 = new CategoryEntry();
subCategoryEntry1.setId(9);
subCategoryEntry1.setAlert(false);
subCategoryEntry1.setLabel("Food");
subCategoryEntry1.setSlug("food");
subCategoryEntry1.setParent(categoryEntry);
subcategories.add(subCategoryEntry1);
categoryEntry.setSubcategories(subcategories);
try {
session.beginTransaction();
session.persist(categoryEntry);
session.getTransaction().commit();
session.close();
} catch (Exception e) {
e.getLocalizedMessage();
}
}
}
和实体类:
package model;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.hibernate.annotations.Fetch;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public class CategoryEntry {
@Id
private int id;
private boolean alert = false;
private String label;
private String slug;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "parent_id")
private CategoryEntry parent;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "parent")
//@JoinColumn(name = "CATEGORY_ID")
private List<CategoryEntry> subcategories;
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@ManyToOne
private SearchAgentEntry searchAgentEntry;
//getters and setters
}
问题是当我运行代码时出现此错误:
java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;
at org.hibernate.cfg.AnnotationBinder.bindManyToOne(AnnotationBinder.java:3038)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1763)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:972)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:799)
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:250)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:231)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:274)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:84)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:474)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:85)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
at service.DatabaseConnectionTest.databaseConnectionIsSuccessful(DatabaseConnectionTest.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
有趣的是,当我运行我的项目时
mvn install or mvn test
一切正常,我可以看到我的数据保存在数据库中。所以这让我觉得 IntelliJ 可能有问题而不是依赖关系。
这是我的 pom.xml 文件
<dependencies>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.0-SP1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.25</version>
</dependency>
<!--Resteasy -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<scope>provided</scope>
</dependency>
<!--<dependency>
<groupId>jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>2.3.19.Final-redhat-1</version>
</dependency>-->
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.1</version>
</dependency>
<!-- JPA & Hibernate-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.5.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.4.Final</version>
</dependency>
<!-- Database -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<!-- Test dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
从其他问题中,我看到这个问题主要发生在未更新 jpa 2.0 依赖项和 hibernate < 4.0。我检查了是否使用了正确的 jar 并且一切看起来都很好 - javax.persistence-api 是 2.2 并且 - hibernate 是 5.3
这也是我的依赖树
-- maven-dependency-plugin:3.0.1:tree (default-cli) @ medbusters ---
[INFO] at.itsv.mobile.backend:medbusters:war:1.0.0-SNAPSHOT
[INFO] +- javax.enterprise:cdi-api:jar:1.0-SP1:provided
[INFO] | +- org.jboss.interceptor:jboss-interceptor-api:jar:1.1:provided
[INFO] | +- javax.annotation:jsr250-api:jar:1.0:provided
[INFO] | \- javax.inject:javax.inject:jar:1.0.0.redhat-6:provided
[INFO] +- org.slf4j:slf4j-api:jar:1.7.25:compile
[INFO] +- org.slf4j:slf4j-jdk14:jar:1.7.25:compile
[INFO] +- org.jboss.resteasy:resteasy-client:jar:3.0.19.SP4-redhat-1:provided
[INFO] | +- org.jboss.resteasy:resteasy-jaxrs:jar:3.0.19.SP4-redhat-1:provided
[INFO] | | +- org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.0_spec:jar:1.0.0.Final-redhat-1:provided
[INFO] | | +- org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:jar:1.0.0.Final-redhat-1:provided
[INFO] | | \- javax.activation:activation:jar:1.1.1.redhat-5:provided
[INFO] | \- org.jboss.logging:jboss-logging:jar:3.3.1.Final-redhat-1:compile
[INFO] +- at.itsv.tools:sv-logging:jar:2016.4.0.eap7:compile
[INFO] | +- at.itsv.tools:sv-utils:jar:2016.4.0.eap7:compile
[INFO] | | \- commons-beanutils:commons-beanutils:jar:1.9.3:compile
[INFO] | | \- commons-collections:commons-collections:jar:3.2.2:compile
[INFO] | +- at.itsv.tools:sv-errorhandling:jar:2016.4.0.eap7:compile
[INFO] | \- org.slf4j:slf4j-ext:jar:1.7.7.redhat-3:compile
[INFO] | \- ch.qos.cal10n:cal10n-api:jar:0.8.1:compile
[INFO] +- com.fasterxml.jackson.core:jackson-core:jar:2.9.6:compile
[INFO] +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.6:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.0:provided
[INFO] +- org.json:json:jar:20180130:compile
[INFO] +- org.apache.commons:commons-lang3:jar:3.7:compile
[INFO] +- org.jdom:jdom:jar:1.1:compile
[INFO] +- javax.persistence:javax.persistence-api:jar:2.2:compile
[INFO] +- org.hibernate:hibernate-core:jar:5.3.5.Final:compile
[INFO] | +- org.javassist:javassist:jar:3.23.1-GA:compile
[INFO] | +- net.bytebuddy:byte-buddy:jar:1.8.17:compile
[INFO] | +- antlr:antlr:jar:2.7.7:compile
[INFO] | +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.0.0.Final-redhat-1:provided
[INFO] | +- org.jboss:jandex:jar:2.0.2.Final-redhat-1:compile
[INFO] | +- com.fasterxml:classmate:jar:1.3.4:compile
[INFO] | +- javax.activation:javax.activation-api:jar:1.2.0:compile
[INFO] | +- dom4j:dom4j:jar:1.6.1:compile
[INFO] | \- org.hibernate.common:hibernate-commons-annotations:jar:5.0.4.Final:compile
[INFO] +- org.hibernate:hibernate-entitymanager:jar:5.3.4.Final:compile
[INFO] +- org.mariadb.jdbc:mariadb-java-client:jar:2.2.6:compile
[INFO] +- mysql:mysql-connector-java:jar:8.0.12:compile
[INFO] | \- com.google.protobuf:protobuf-java:jar:2.6.0:compile
[INFO] +- junit:junit:jar:4.12:test
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.3:test
[INFO] | +- org.apache.httpcomponents:httpcore:jar:4.4.6:test
[INFO] | +- commons-logging:commons-logging:jar:1.2:compile
[INFO] | \- commons-codec:commons-codec:jar:1.9:test
[INFO] \- commons-io:commons-io:jar:2.5:test
IntelliJ 版本为 2018.2.1
我阅读了几乎所有关于 stakoverflow 的未解决问题以及任何与该问题相关的问题,但到目前为止没有任何帮助。我在 IDE 配置方面也不是超级进步,如果问题出在 IDE 中,我将无法自己解决。
任何帮助,将不胜感激
解决方案
IntelliJ 使用的是旧的 jdk 版本 1.8,因此也使用旧版本的 JPA (1.0),而不管我添加的依赖项。我把它改成了我电脑上安装的最新的jdk版本,问题就解决了。
File -> Project Strucutre -> in Platform Settings - SDKs and from there choose the jdk folder.
我需要的唯一依赖是
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.5.Final</version>
</dependency>
它会自动添加 javax-persistance-api:2.2 和 hibernate
我最近开始使用 Java,以前从未使用过 IntelliJ,而且我不熟悉在处理项目时必须牢记的所有配置。所以有点像这种配置的东西被忽略了,花了我几天的工作时间:)
推荐阅读
- java - 如何在测试代码中测试 Hibernate 对象相等性?
- verilog - 即使语法看起来正确,简单的代码也会产生错误(ISE VERILOG)
- java - 当我尝试在 Eclipse 控制台上打印 Hello World 时,什么都没有打印
- google-apps-script - IMPORTHTML 一段时间后返回 N/A,有解决方法吗?
- c++ - C++20 概念之谜 boolean-testable
- python-3.x - 将一系列熊猫数据框合并为单个数据框
- c# - 如何让玩家在统一 2d 中停止无限跳跃
- python-3.x - Visual Studio 代码调试
- django - 保存前检查重复对象
- promise - Figma Plugin - 帮助以编程方式创建文本样式