使用Hibernate / JPA在运行时抛出AbstractMethodError [英] AbstractMethodError thrown at runtime with Hibernate/JPA
问题描述
对于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屋!