2015-10-21 183 views
1

錯誤消息JPA /休眠java.lang.NoSuchMethodError

Oct 20, 2015 10:56:33 PM org.hibernate.dialect.Dialect INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL9Dialect Oct 20, 2015 10:56:33 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey;

我知道是severalquestionshereabout this,但在多數人身上,他們要求確保我使用Hibernate作爲陳述4.3+和JPA2.1 +。而且我相信,我使用他們兩個:

這裏是我的的persistence.xml

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="web" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/web"/> 
     <property name="javax.persistence.jdbc.user" value="postgresUser"/> 
     <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/> 
     <property name="javax.persistence.jdbc.password" value="admin"/> 
     <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
     <property name="hibernate.ejb.entitymanager_factory_name" value="web" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

這裏是我的的pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<groupId>edu.utfpr</groupId> 
<artifactId>ProjetoWeb</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>war</packaging> 

<name>ProjetoWeb</name> 

<properties> 
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>4.3.1.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.torpedoquery</groupId> 
     <artifactId>org.torpedoquery</artifactId> 
     <version>1.7.0</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.1-api</artifactId> 
     <version>1.0.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-jpamodelgen</artifactId> 
     <version>5.0.2.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.2-1002-jdbc4</version> 
    </dependency> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>7.0</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
       <compilerArguments> 
        <endorseddirs>${endorsed.dir}</endorseddirs> 
       </compilerArguments> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.3</version> 
      <configuration> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>2.6</version> 
      <executions> 
       <execution> 
        <phase>validate</phase> 
        <goals> 
         <goal>copy</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>${endorsed.dir}</outputDirectory> 
         <silent>true</silent> 
         <artifactItems> 
          <artifactItem> 
           <groupId>javax</groupId> 
           <artifactId>javaee-endorsed-api</artifactId> 
           <version>7.0</version> 
           <type>jar</type> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
</project> 

最後在這裏BarEntity的一個例子

@Entity 
public class BarEntity implements Serializable { 

    @Id 
    @GeneratedValue 
    private long id; 

    @ManyToOne 
    @JoinColumn(name = "fooId", referencedColumnName = "id") 
    @Cascade({CascadeType.SAVE_UPDATE}) 
    private Foo foo; 

    @Column(nullable = false, unique = true) 
    private String bar; 

    @Column(nullable = false) 
    private String foobar; 
} 

我可以做些什麼來部署?

我很抱歉無法將pom.xml/persistence.xml降低爲更通用,因爲我不確定錯誤在哪裏。

+0

在CLASSPATH中有一個早期版本的JPA API(它沒有該方法)。這就是所有這些,從消息 –

回答

2

正如Zhaohermitmaster所述,這肯定是一個依賴性問題。但是,我相信對於那些經驗不足的人來說,可能很難確定應該匹配/可能是錯誤的。

所以,這裏是一個如何檢查這個

相關數據pom.xml是:

<artifactId>hibernate-entitymanager</artifactId> 
    <version>4.3.1.Final</version> 
    (...) 
    <artifactId>hibernate-jpa-2.1-api</artifactId> 
    <version>1.0.0.Final</version> 
    (...) 
    <artifactId>hibernate-jpamodelgen</artifactId> 
    <version>5.0.2.Final</version> 

正如他這樣做是正確的話Hibernate需要是4.3或更高版本的用戶說明。但是,它應該使用相同版本的hibernate和jpamodelgen。

兩個的Hibernate的EntityManager休眠-jpamodelgen應該有相同的號碼。是它:

4.3.15.0.2

+0

謝謝。改變你說的話真的解決了這個問題。 – DeMarco

3

它通常意味着您正在使用的庫的版本與您真正依賴的庫版本不兼容。請檢查javax.persistence.JoinColumn.foreignKey()庫的版本或正在使用此庫的人員的版本,以確保您使用的是正確版本。

+0

不言自明如何檢查此版本?有沒有println或我可以做的事情? – DeMarco

+0

它是你的pom.xml文件的依賴關係。首先,您需要找出使用javax.persistence.JoinColumn.foreignKey()方法的庫。然後檢查它需要的版本。如果您錯誤地使用版本,您將在運行時遇到這種錯誤。 –

+0

這絕對是一個依賴性問題。還要查找重複的依賴關係,並嘗試消除它們。即兩個不同版本的jpa-api等。 – hermitmaster