使用Hibernate / JPA在运行时抛出AbstractMethodError [英] AbstractMethodError thrown at runtime with Hibernate/JPA

查看:152
本文介绍了使用Hibernate / JPA在运行时抛出AbstractMethodError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于Hibernate和JPA,我绝对是新手,我试图按照JPA规范实现一个使用Hibernate的教程。下面是一些问题。



我有这些类:
$ b <1> HelloWorldClient 类是我的应用程序的入口点,包含 main 方法:

  package client; 

导入javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

导入entity.Message;
$ b $ public class HelloWorldClient {
public static void main(String [] args){

EntityManagerFactory emf = Persistence.createEntityManagerFactory(merge);

EntityManager em = emf.createEntityManager();
EntityTransaction txn = em.getTransaction();
txn.begin();

留言信息=新留言(你好); //暂态
em.persist(message); //持久状态

txn.commit();
em.close();

message.setText(Hi); //修改消息的分离状态

EntityManager em2 = emf.createEntityManager();
EntityTransaction txn2 = em2.getTransaction();
txn2.begin();

//返回的mergedMessage是一个持久化对象
//当txn2在数据库中被提交并更新时,对mergedMessage的任何更改都会被检查脏
message mergedMessage = em2 .merge(消息);

txn2.commit();
em2.close();


//显式分离对象
/ *
EntityManager em3 = emf.createEntityManager();
EntityTransaction txn3 = em.getTransaction();
txn3.begin();

留言msg =新留言(你好); //暂态
em.persist(msg); //持久状态

em.detach(msg); //显式分离消息对象
txn3.commit();
em3.close();
* /

}
}

2 )映射到数据库表的 Message 实体类:

 包实体; 

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name =message)
public class Message {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name =ID)
私人长ID;

@Column(name =TEXT)
private String text;

public Message(){}
public Message(String text){
this.text = text;
}

public void setText(String text){
this.text = text;
}

}

3)最后我有 META-INF 中的 persistence.xml 配置文件我的应用程序的文件夹:

 <?xml version =1.0encoding =UTF-8?> 
< persistence xmlns:xsi =http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation =http://java.sun.com/xml/ns / persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd
version =2.0xmlns =http://java.sun.com/xml/ns/persistence >

< persistence-unit name =合并transaction-type =RESOURCE_LOCAL>
<属性>

<! - 数据库连接设置 - >
< property name =javax.persistence.jdbc.drivervalue =com.mysql.jdbc.Driver/>
< property name =javax.persistence.jdbc.urlvalue =jdbc:mysql:// localhost:3306 / hello-world/>
< property name =javax.persistence.jdbc.uservalue =root/>
< property name =javax.persistence.jdbc.passwordvalue =myPassword/>

<! - - SQL方言 - >
< property name =hibernate.dialectvalue =org.hibernate.dialect.MySQLDialect/>

<! - 使用映射元数据自动创建/更新表格 - >
< property name =hibernate.hbm2ddl.autovalue =update/>

<! - 漂亮的打印日志文件和控制台中的SQL - >
< property name =hibernate.format_sqlvalue =true/>
< / properties>

< / persistence-unit>
< /余辉>

当我尝试运行我的应用程序时,我在堆栈跟踪中获得了此错误消息:

 拾取JAVA_TOOL_OPTIONS:-javaagent:/usr/share/java/jayatanaag.jar 
线程mainjava.lang中的异常.AbstractMethodError:org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl $ 4.getConfigurationValues()Ljava / util / Map;
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:404)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
at javax .persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at client.HelloWorldClient.main(HelloWorldClient.java:14)


解决方案

我在尝试执行hibernate时遇到同样的问题教程。这通常意味着添加到构建路径的jar文件之间存在兼容性问题。

在您的情况下,它似乎是
org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.getConfigurationValues()
作为抽象方法出现在最新版本中,因此出现上述错误。尝试将JPA jar更改为以前的版本,这可能会解决问题;这就是我的情况。


I am absolutely new to Hibernate and JPA and I have the following problem trying to implement a tutorial that uses Hibernate following the JPA specification.

I have these classes:

1) A HelloWorldClient class, the entry point of my application, containing the main method:

package client;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import entity.Message;

public class HelloWorldClient {
    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("merging");

        EntityManager em = emf.createEntityManager();
        EntityTransaction txn = em.getTransaction();
        txn.begin();

        Message message = new Message("Hello"); //transient state        
        em.persist(message); //persistent state        

        txn.commit();   
        em.close(); 

        message.setText("Hi"); //modifying the detached state of message

        EntityManager em2 = emf.createEntityManager();
        EntityTransaction txn2 = em2.getTransaction();
        txn2.begin();

        //the returned mergedMessage is a persistent object
        //any changes to mergedMessage will be dirty checked when the txn2 will be committed and updated in the database
        Message mergedMessage = em2.merge(message);

        txn2.commit();
        em2.close();        


        //Detaching objects explicitly
        /*
        EntityManager em3 = emf.createEntityManager();
        EntityTransaction txn3 = em.getTransaction();
        txn3.begin();

        Message msg = new Message("Howdy"); //transient state        
        em.persist(msg); //persistent state    

        em.detach(msg); //detaching the message object explicitly
        txn3.commit();
        em3.close();
        */  

    }
}

2) A Message entity class that is mapped on a database table:

package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="message")
public class Message {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID")  
    private Long id;

    @Column(name="TEXT")    
    private String text;

    public Message() {}
    public Message(String text) {
        this.text = text;
    }

    public void setText(String text) {
        this.text = text;
    }

}

3) And finally I have the persistence.xml configuration file in the META-INF folder of my application:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">

    <persistence-unit name="merging" transaction-type="RESOURCE_LOCAL">
        <properties>

            <!-- Database connection settings -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hello-world" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="myPassword" />

            <!-- SQL dialect -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />

            <!-- Create/update tables automatically using mapping metadata -->
            <property name="hibernate.hbm2ddl.auto" value="update" />

            <!-- Pretty print the SQL in the log file and console -->
            <property name="hibernate.format_sql" value="true" />
        </properties>

    </persistence-unit>
</persistence>

When I try to run my application, I obtain this error message in the stacktrace:

Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar 
Exception in thread "main" java.lang.AbstractMethodError: org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.getConfigurationValues()Ljava/util/Map;
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:404)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at client.HelloWorldClient.main(HelloWorldClient.java:14)

解决方案

I've had the same issue when trying to do hibernate tutorials. It usually means that there are compatibility issues between the jar files you added to your build path.

in your case, it would seem that org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.getConfigurationValues() appears in the latest version as an abstract method, hence the above error. Try changing the JPA jar to a previous version, that will probably solve the issue; that's what helped in my case.

这篇关于使用Hibernate / JPA在运行时抛出AbstractMethodError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆