Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Please help me with this error. Follow my code below:

This my class/entity Person:

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;
}

}

This is my class/entity Experience:

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;
}

}

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

So, I'm trying to use this code to make a query:

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();

But always happen this error:

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)

My maven dependencies is as follows:

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
like image 788
Jhonathan Wyterlin Avatar asked Mar 21 '14 04:03

Jhonathan Wyterlin


2 Answers

I don't know why Hibernate is wanting that foreignKey attribute on the @JoinColumn annotation, but it was added in JPA 2.1. Use the JPA 2.1 API dependency instead of the 2.0.

like image 110
chrylis -cautiouslyoptimistic- Avatar answered Sep 19 '22 18:09

chrylis -cautiouslyoptimistic-


The many to one mapping with @JoinColumn(name="idPerson", referencedColumnName="id") means idPerson in the Experience class is related to the id of the Person table.

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

Here there is no idPerson I believe that's the problem. You must specify a foreign key for the mapping, between Person and Experiance like this

Person
id col col1 
-----------
1   s    s   

Experience
id  personId col col1
---------------------
1    1       s    d
2    1       f    d

Now you can specify multiple Experience for a person by

@ManyToOne          // more than one experiance for a person

@JoinColumn        // for condition

(name="personId", referencedColumnName="id")    // for condition Experience.personId==person.id
like image 33
Dileep Avatar answered Sep 18 '22 18:09

Dileep