java.lang.NoSuchMethodError : javax. persistence.JoinColumn.foreignKey

标签 java hibernate maven jpa

请帮我解决这个错误。按照下面的代码:

这是我的类(class)/实体人物:

package entities;

import java.util.Calendar;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Person {

@Id
@GeneratedValue
private long id;

@Column
private String name;

@Temporal(TemporalType.DATE)
private Calendar dateBirth;

@Column
private String email;

// MappedBy: Name of the instance that will indicate to whom One belongs, that is, an experience.
//           It should say which person is associated
// TargetEntity: Informs the entity we are associating
// FetchType.Lazy: Was chosen for performance
// Cascade: ALL to allow changes in all relationships.
 @OneToMany(mappedBy = "person", targetEntity = Experience.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
 private List<Experience> experiences;

// Getters and setters
public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Calendar getDateBirth() {
    return dateBirth;
}

public void setDateBirth(Calendar dateBirth) {
    this.dateBirth = dateBirth;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public List<Experience> getExperiences() {
    return experiences;
}

public void setExperiences(List<Experience> experiences) {
    this.experiences = experiences;
}

}

这是我的类/实体体验:

package entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Experience {

@Id
@GeneratedValue
private long id;

@ManyToOne
@JoinColumn(name="idPerson", referencedColumnName="id")
private Person person;

@Column
private String company;

@Column
private String activities;

// Getters and setters

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public Person getPerson() {
    return person;
}

public void setPerson(Person person) {
    this.person = person;
}

public String getCompany() {
    return company;
}

public void setCompany(String company) {
    this.company = company;
}

public String getActivities() {
    return activities;
}

public void setActivities(String activities) {
    this.activities = activities;
}

}

我的 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"> 

<persistence-unit name="professionalmanagementDB">

    <!-- JPA implementation -->
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <!-- Entities --> 
    <class>entities.Person</class>
    <class>entities.Experience</class>

    <properties> 
        <property name="hibernate.dialect"               value="org.hibernate.dialect.MySQLDialect" /> 
        <property name="hibernate.hbm2ddl.auto"          value="update" /> 
        <property name="hibernate.show_sql"              value="true" /> 
        <property name="hibernate.format_sql"            value="true" />  
        <property name="javax.persistence.jdbc.driver"   value="com.mysql.jdbc.Driver" /> 
        <property name="javax.persistence.jdbc.url"      value="jdbc:mysql://localhost/professionalmanagementDB" /> 
        <property name="javax.persistence.jdbc.user"     value="root" /> 
        <property name="javax.persistence.jdbc.password" value="" /> 
    </properties>

</persistence-unit>

</persistence>

因此,我尝试使用此代码进行查询:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("professionalmanagementDB");
EntityManager manager = factory.createEntityManager();

String jpql = "select p ";
jpql += "from Person";

Query query = manager.createQuery(jpql);

List<Person> list = query.getResultList();

但是总是会出现这个错误:

java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;
org.hibernate.cfg.AnnotationBinder.bindManyToOne(AnnotationBinder.java:2881)
org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1795)
org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:963)
org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:796)
org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3790)
org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3744)
org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410)
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:397)
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:73)
org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
dao.PersonDAO.readAll(PersonDAO.java:65)
manager.PersonManager.getPersons(PersonManager.java:17)
org.apache.jsp.HomeScreen_jsp._jspService(HomeScreen_jsp.java:87)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我的maven依赖如下:

javaee-api:7.0
hibernate-jpa-2.0-api:1.0.1.Final
hibernate-entitymanager:4.3.4.Final
mysql-connector-java:5.1.29

最佳答案

我不知道为什么 Hibernate 需要 @JoinColumn 注释上的 foreignKey 属性,但是 it was added in JPA 2.1 .使用 JPA 2.1 API 依赖项而不是 2.0。

关于java.lang.NoSuchMethodError : javax. persistence.JoinColumn.foreignKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22550463/

相关文章:

java - HQL 中 STR() 函数的错误使用

java - 使用大量数据提高 hibernate 插入性能的最佳方法

maven - 嵌入式 GlassFish 的官方 Maven 存储库是什么?

java - liquibase 中的 SQL 文件从未执行过

java - 如何让 NoClassDefFoundError 在编译阶段暴露

java - 有没有办法在不创建新的临时 ArrayList 的情况下更改 ArrayList 的泛型类型?

java - 在 RecyclerView 中使用多个 View 和数据集

java - JPA - 使用 CriteriaQuery 的 LIKE 过滤 MySQL DOUBLE (6,2)

java - Spring-boot:将 Servlet Filter 应用于除一个之外的所有路由

java - org.springframework.dao.InvalidDataAccessApiUsageException : The given string value: [] cannot be transformed to Json object