【问题标题】:Error: java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;错误:java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;
【发布时间】:2015-09-10 20:23:12
【问题描述】:

这不是一个重复的问题。正如在这个问题的正文中所解释的那样,由于各种原因,我不得不返回一个旧的 Spring 和 Hibernate 项目。该项目使用这两个框架连接到使用 Apache Tomcat 的 Apache Derby 数据库,并在去年遇到了一个依赖关系问题,如下所述:

Error: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey with Spring controller

但同样的问题在同一个项目中再次出现,但已应用去年的修复。

同样,这不是一个重复的问题。它询问为什么项目中先前解决的问题在先前解决该问题之后再次发生,以及现在正在使用的项目版本并遇到相同问题包括去年的修复。我不明白为什么。

当我尝试构建去年的固定项目时,我遇到了异常:

used by: java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;

因为两个数据库表之间是一对多的关系。异常似乎指向调度程序 servlet 存储库 bean 引用:

<bean id="bookDAOImpl" class="library.dao.BookDAOImpl" />

如所示:

Could not autowire field: private org.hibernate.SessionFactory library.dao.BookDAOImpl.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/classes/library-servlet.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;

在堆栈跟踪中。

在我使用的调度器 servlet 中无法创建 bean。

servlet如下:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/mvc" 
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       
   xsi:schemaLocation="http://www.springframework.org/schema/beans 
                       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
                       http://www.springframework.org/schema/context 
                       http://www.springframework.org/schema/context/spring-context-4.0.xsd 
                       http://www.springframework.org/schema/mvc                            
                       http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd                           
                       http://www.springframework.org/schema/tx    
                       http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
                       http://www.springframework.org/schema/aop
                       http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

<!-- Uses annotations in classes for JavaBeans. XML is an alternative. -->
<mvc:annotation-driven />   

<!-- Base package of Library. -->
<context:component-scan base-package="library" />    

<!-- Model. -->
<bean id="person" class="library.model.Person" />
<bean id="book" class="library.model.Book" />        

<!-- Spring Controllers. -->
<bean id="adminController" class="library.controller.admin.AdminController" />    
<bean id="personController" class="library.controller.PersonController" />      
<bean id="bookController" class="library.controller.BookController" /> 
<bean id="exceptionController" class="library.controller.ExceptionController" />     

<!-- Spring Interceptors. -->
<mvc:interceptors>
    <bean id="clientInterceptor" class="library.interceptor.ClientInterceptor" />
</mvc:interceptors>

<!-- Spring Services. -->
<bean id="personService" class="library.service.PersonService" />    
<bean id="bookService" class="library.service.BookService" />  

<!-- Spring Repositories. -->
<bean id="personDAOImpl" class="library.dao.PersonDAOImpl" />    
<bean id="bookDAOImpl" class="library.dao.BookDAOImpl" />       

<!-- Spring Validators. -->
<bean id="personValidator" class="library.validator.PersonValidator" />    
<bean id="bookValidator" class="library.validator.BookValidator" />     

<!-- Spring ViewResolver. -->               
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
         <value>/WEB-INF/jsp/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>   

<!-- Spring MesssageSource. -->         
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename"> 
        <value>/WEB-INF/classes/messages</value>    
    </property>    
</bean>

<!-- Spring Properties file for Library. -->      
<bean id="propertiesFactory" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="location">  
         <value>classpath:library.properties</value>             
    </property>
</bean>      

<!-- Hibernate DataSource. -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">        
    <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver" />
    <property name="url" value="jdbc:derby://localhost:1527/Library" />
    <property name="username" value="username" />
    <property name="password" value="password" />            
</bean>   

<!-- Hibernate Interceptors. -->
<bean id="serverInterceptor" class="library.interceptor.ServerInterceptor" />

<!-- Hibernate SessionFactory. -->    
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">    
    <property name="dataSource" ref="dataSource"></property>                  
    <property name="hibernateProperties">
        <props>               
           <prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>
           <prop key="hibernate.show_sql">false</prop>
           <prop key="hibernate.current_session_context_class">thread</prop>

           <!-- What to do with the database schema. -->
           <prop key="hbm2ddl.auto">update</prop>    
           <!-- validate:    validate the schema, makes no changes to the database.
                update:      update the schema.
                create:      creates the schema, destroying previous data.
                create-drop: drop the schema at the end of the session. -->                 
        </props>            
    </property>                                                                                                                                
    <property name="entityInterceptor">
        <ref bean="serverInterceptor" />            
    </property>                                                                                                                                             
    <property name="packagesToScan">
        <list>
            <value>library.model</value>                
        </list>
    </property>          
</bean>

<!-- Hibernate TransactionManagment. -->
<tx:annotation-driven />                
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
   <property name="sessionFactory" ref="sessionFactory" />
</bean>  

我去年遇到了这个问题,通过改变依赖关系解决了,如下所述:

Error: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey with Spring controller ` 但是,该项目的依赖关系从那时起就没有改变,它的任何配置也没有改变,所以我不明白为什么会出现这个问题。

与去年一样,该项目使用 Spring 4.0.2 和 Hibernate 4.3.5,使用 Apache Tomcat 8.0.3.0 在 NetBeans 8 中运行。

在 Java 类中,一个名为 Person 的类与另一个名为 Book 的类之间存在 1:M 关系。也为这些声明了数据库表。

类人如下:

package library.model;

import com.fasterxml.jackson.annotation.JsonManagedReference;
import java.io.Serializable;
import java.util.ArrayList;
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.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="PERSON")
public class Person implements Serializable {

// Attributes.    
@Id
@Column(name="PERSON_ID", unique=true, nullable=false)    
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer personId;

@Column(name="NAME", nullable=false, length=50)      
private String name;

@Column(name="ADDRESS", nullable=false, length=100)
private String address;

@Column(name="TELEPHONE", nullable=false, length=10)
private String telephone;

@Column(name="EMAIL", nullable=false, length=50)
private String email;

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="person") 
@JsonManagedReference
private List<Book> books;

// Constructors.
public Person() {
    this.personId = 0;
    this.name = ("");
    this.address = ("");
    this.telephone = ("");
    this.email = ("");
    this.books = null;
}

public Person(Integer personId, String name, String address, String telephone, String email, ArrayList<Book> books) {
    this.personId = personId;
    this.name = name;
    this.address = address;
    this.telephone = telephone;
    this.email = email;
    this.books = books;
}

使用 getter 和 setter。

书有:

package library.model;

import com.fasterxml.jackson.annotation.JsonBackReference;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="BOOK")
public class Book implements Serializable {

// Attributes.
@Id
@Column(name="BOOK_ID", unique=true, nullable=false)
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer bookId;

@Column(name="AUTHOR", nullable=false, length=50)
private String author;

@Column(name="TITLE", nullable=false, length=50)
private String title;

@Column(name="DESCRIPTION", nullable=false, length=500)
private String description;

@Column(name="ONLOAN", nullable=false, length=5)
private String onLoan;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="person_id")
@JsonBackReference
private Person person;

// Constructors.
public Book() {
    this.bookId= 0;
    this.author = ("");
    this.title = ("");
    this.description = ("");  
    this.onLoan = "false";
}

public Book(Integer bookId, String author, String title, String description, String onLoan) {
    this.bookId = 0;
    this.author = author;
    this.title = title;
    this.description = description;     
    this.onLoan = onLoan;
}

BookDAOImpl 类是这样设置的:

package library.dao;

import java.util.List;
import library.model.Book;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository("bookDAOImpl")
public class BookDAOImpl implements GenericDAO<Book> {

@Autowired
private SessionFactory sessionFactory;

static final Logger logger = Logger.getLogger(BookDAOImpl.class.getName());

public BookDAOImpl() {
}

@Override
public void delete(Integer bookId) {
    logger.info(BookDAOImpl.class.getName() + ".delete() method called.");

    Session session = sessionFactory.openSession();
    Transaction transaction = session.getTransaction();        
    try {
        transaction.begin();
        session.delete((Book) session.get(Book.class, bookId));
        transaction.commit();            
    }
    catch(RuntimeException e) {
        transaction.rollback();
        throw e;
    }
    finally {
        session.close();
    }
}

但是为什么在所有配置不变的情况下,我现在可以得到这个?

项目中的库如下:

24 Jun 2015  23 35           445,288 antlr-2.7.7.jar
24 Jun 2015  23 35             4,467 aopalliance-1.0.jar
24 Jun 2015  23 35           160,519 commons-dbcp-1.4.jar
24 Jun 2015  23 35            62,050 commons-logging-1.1.3.jar
24 Jun 2015  23 35         2,703,892 derby-10.9.1.0.jar
24 Jun 2015  23 35           535,985 derbyclient-10.9.1.0.jar
24 Jun 2015  23 35           313,898 dom4j-1.6.1.jar
24 Jun 2015  23 35            75,311 hibernate-commons-annotations-4.0.4.Final.jar
24 Jun 2015  23 35         5,230,007 hibernate-core-4.3.5.Final.jar
24 Jun 2015  23 35           113,371 hibernate-jpa-2.1-api-1.0.0.Final.jar
24 Jun 2015  23 35            38,605 jackson-annotations-2.4.0.jar
24 Jun 2015  23 35           225,306 jackson-core-2.4.1.jar
24 Jun 2015  23 36           228,552 jackson-core-asl-1.9.7.jar
24 Jun 2015  23 35         1,074,275 jackson-databind-2.4.1.jar
24 Jun 2015  23 35           786,084 jackson-mapper-lgpl-1.9.13.jar
24 Jun 2015  23 35            76,551 jandex-1.1.0.Final.jar
24 Jun 2015  23 35           714,194 javassist-3.18.1-GA.jar
24 Jun 2015  23 35           162,126 javax.persistence-2.1.0.jar
24 Jun 2015  23 35            57,183 jboss-logging-3.1.3.GA.jar
24 Jun 2015  23 35            11,558 jboss-logging-annotations-1.2.0.Beta1.jar
24 Jun 2015  23 35            27,717 jboss-transaction-api_1.2_spec-1.0.0.Final.jar
24 Jun 2015  23 35            20,682 jstl-1.1.2.jar
24 Jun 2015  23 35            15,071 jta-1.1.jar
24 Jun 2015  23 35           367,444 log4j-1.2.14.jar
24 Jun 2015  23 35            52,150 persistence-api-1.0.jar
24 Jun 2015  23 36            36,364 spring-annotation-base-1.0.2.jar
24 Jun 2015  23 35           352,730 spring-aop-4.0.2.RELEASE.jar
24 Jun 2015  23 35           669,044 spring-beans-4.0.2.RELEASE.jar
24 Jun 2015  23 35           974,272 spring-context-4.0.2.RELEASE.jar
24 Jun 2015  23 35           960,994 spring-core-4.0.2.RELEASE.jar
24 Jun 2015  23 35           204,780 spring-expression-4.0.2.RELEASE.jar
24 Jun 2015  23 35           419,614 spring-jdbc-4.0.2.RELEASE.jar
24 Jun 2015  23 35           366,844 spring-orm-4.0.2.RELEASE.jar
24 Jun 2015  23 35           248,204 spring-tx-4.0.2.RELEASE.jar
24 Jun 2015  23 35           665,015 spring-web-4.0.2.RELEASE.jar
24 Jun 2015  23 35           660,329 spring-webmvc-4.0.2.RELEASE.jar
24 Jun 2015  23 35           393,259 standard-1.1.2.jar

【问题讨论】:

  • 您仍在使用 Hibernate 4.0.4 而早期的解决方案建议升级到 4.3.x?
  • 好像你有这个错误是因为休眠库。你用的是maven吗?尝试添加this依赖:
  • 对不起。我正在使用 4.3.5。问题已更正。
  • 该项目的库中有javax-persistence-2.1.0.jar
  • 一定发生了一些变化。 j2ee、tomcat 或其他东西。请检查依赖项并提及更改的库。

标签: java spring hibernate spring-mvc


【解决方案1】:

您收到此异常是因为在类路径的上方某处存在旧版本的 javax.persistence API。

从类路径中删除旧版本就可以了。

【讨论】:

  • 该项目的库中有javax-persistence-2.1.0.jar。这就是去年解决问题的方法。但现在又复发了。
  • 是的,检查旧版本的 jpa 是否存在于类路径中。它可能存在于容器的默认 lib 文件夹中
  • 好主意。我稍后会尝试检查。
  • 该项目的库中有javax-persistence-2.1.0.jar。没有此库的早期版本。
【解决方案2】:

有同样的问题。这是由于类路径中的旧 Java EE 6 API:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>

将其更改为:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>

如果您在以后的调试中遇到此类问题:

$ mvn dependency:tree
[INFO] +- javax:javaee-web-api:jar:6.0:provided

[INFO] +- org.hibernate:hibernate-entitymanager:jar:4.3.11.Final:compile
[INFO] |  +- org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile
[INFO] |  +- org.jboss.logging:jboss-logging-annotations:jar:1.2.0.Beta1:compile
[INFO] |  +- org.hibernate:hibernate-core:jar:4.3.11.Final:compile
[INFO] |  |  +- antlr:antlr:jar:2.7.7:compile
[INFO] |  |  \- org.jboss:jandex:jar:1.1.0.Final:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  +- org.hibernate.common:hibernate-commons-annotations:jar:4.0.5.Final:compile

[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile

[INFO] |  +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.0.0.Final:compile
[INFO] |  \- org.javassist:javassist:jar:3.18.1-GA:compile

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 2015-02-07
    • 2023-03-10
    • 2019-01-24
    • 2014-06-24
    • 2014-08-26
    • 2014-04-05
    • 2014-12-24
    • 2016-06-15
    相关资源
    最近更新 更多