当前位置: 首页 > 面试题库 >

Hibernate buildSessionFactory()异常

韦寒
2023-03-14
问题内容

我的hibernate状态很严重。我遵循了各种书籍和在线教程,但是我曾经遇到过HibernateUtil.java Line抛出的相同异常“
ExceptionInInitializerError”

SessionFactory sf = cfg.configure().buildSessionFactory();

我的Tomcat日志显示以下内容:

Caused by: java.lang.ExceptionInInitializerError
at de.marcelstuht.nerven2.server.HibernateUtil.buildSessionFactory(HibernateUtil.java:23)
at de.marcelstuht.nerven2.server.HibernateUtil.<clinit>(HibernateUtil.java:8)
at de.marcelstuht.nerven2.shared.model.Account.<init>(Account.java:52)
at de.marcelstuht.nerven2.server.GreetingServiceImpl.loginServer(GreetingServiceImpl.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
... 21 more

Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:180)
at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:131)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:345)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1737)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775)
at de.marcelstuht.nerven2.server.HibernateUtil.buildSessionFactory(HibernateUtil.java:18)
... 29 more

Caused by: org.hibernate.InstantiationException: could not instantiate test objectde.marcelstuht.nerven2.shared.model.Account
at org.hibernate.engine.internal.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:49)
at org.hibernate.engine.internal.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:68)
at org.hibernate.tuple.PropertyFactory.buildIdentifierProperty(PropertyFactory.java:75)
at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:143)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:498)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:142)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:158)
... 34 more

Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.hibernate.engine.internal.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:46)
... 44 more

Caused by: java.lang.NullPointerException
at de.marcelstuht.nerven2.shared.model.Account.<init>(Account.java:52)
... 49 more

Account.java

package de.marcelstuht.nerven2.shared.model;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import org.apache.commons.codec.digest.DigestUtils;
import org.hibernate.Session;
import org.hibernate.criterion.*;

import de.marcelstuht.nerven2.server.HibernateUtil;

@Entity
@Table(name = "account")
public class Account implements Serializable {

private static final long serialVersionUID = 2675108132819989138L;

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

@NotNull
    @Column(name = "username", unique = true)
String username;

@Column(name = "password")
String password;

@Column(name = "email")
String email;

protected Session session;


public Account() {
    session = HibernateUtil.getSessionFactory().openSession();
}

public Account(Long id) {
    this.id = id;
    session = HibernateUtil.getSessionFactory().openSession();
}

public Account(Long id, String username, String password, String email) {
    this.id = id;
    this.username = username;
    this.password = password;
    this.email = email;
    session = HibernateUtil.getSessionFactory().openSession();

}

public void setId(Long newid) {
    id = newid;
}

public Long getId() {
    return id;
}

public void setUsername(String user) {
    username = user;
}

public String getUsername() {
    return username;
}

public void setEmail(String mail) {
    email = mail;
}

public String getEmail() {
    return email;
}

public void setPassword(String newPass) {
    password = newPass;
}

public void setNewPassword(String newPass) {
    password = hashPassword(newPass);
}

public boolean checkPassword(String pass) {
    pass = hashPassword(pass);
    if (password.equals(pass)) return true;
    else return false;
}

private String hashPassword(String password) {
    return DigestUtils.shaHex("wudu390909dfh"+password);
}

public Account get(Long id) {
    session.beginTransaction();
    Account result = (Account) session.get("account", id);
    session.getTransaction().commit();
    return result;
}

public Long saveOrUpdate(Account account) {
    if (account == null) {
        return null;
    }

    session.beginTransaction();

    session.saveOrUpdate(account);
    Long id = (Long) session.getIdentifier(account);

    session.getTransaction().commit();
    return id;
}

public void delete(Account account) {
    if (account == null) {
        return;
    }
    session.beginTransaction();
    session.delete(account);
    session.getTransaction().commit();
}

public List<Account> getAccountByUsername(String user) {
    session.beginTransaction();

    @SuppressWarnings("unchecked")
    List<Account> result = session
            .createCriteria(Account.class)
            .add(Restrictions.eq("username", user))
            .list();
    session.getTransaction().commit();

    return result;
}

}

HibernateUtil.java

package de.marcelstuht.nerven2.server;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.jboss.logging.Logger;

public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();

protected HibernateUtil() {

}

private static SessionFactory buildSessionFactory() {
    try {
        // Create the SessionFactory from hibernate.cfg.xml
        Configuration cfg = new Configuration();
        SessionFactory sf = cfg.configure().buildSessionFactory();
        return sf;
    } catch (Exception ex) {
        // Make sure you log the exception, as it might be swallowed
        Logger.getLogger(HibernateUtil.class).error("Initial SessionFactory creation failed.", ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}
}

hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://127.0.0.1:3306/ba</property>
    <property name="connection.username">*myuser*</property>
    <property name="connection.password">*mypassword*</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

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

    <!-- Disable the second-level cache  -->
    <!-- <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>-->

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup -->        
    <property name="hibernate.bytecode.provider">javassist</property>

    <!-- Names the annotated entity class -->
    <mapping class="de.marcelstuht.nerven2.shared.model.Account"/>

</session-factory>

我尝试了Hibernate
3.6.9和4.0.1(在不同的Eclipse项目中)。在Skitch上可以找到我添加到项目中的JAR的屏幕快照:https ://skitch.com/marcelstuht/g7h8h/properties-for-
nerven2


问题答案:

由…使用:java.lang.NullPointerException at
de.marcelstuht.nerven2.shared.model.Account。(Account.java:52)…还有49个

从“帐户”中的构造函数中删除所有内容。您具有循环依赖关系。而且Hibernate对其bean使用public no args consructor

  1. HibernateUtil负载
  2. 这迫使静态对象运行buildSessionFactory
  3. Hibernate通过无参数实例化Account
  4. 依次调用HibernateUtil .....

相信我:除了POJO设置程序外,没有代码的public no arg构造函数。没有其他的。



 类似资料:
  • 应用程序通常会通过抛出另一个异常来响应异常。 实际上,第一个异常引起第二个异常。 它可以是非常有助于用户知道什么时候一个异常导致另一个异常。 “异常链(Chained Exceptions)”帮助程序员做到这一点。 以下是Throwable中支持异常链的方法和构造函数。 Throwable getCause() Throwable initCause(Throwable) Throwable(St

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u

  • 问题内容: 异常存储在哪里?堆,堆。如何为异常分配和释放内存?现在,如果您有多个需要处理的异常,是否创建了所有这些异常的对象? 问题答案: 我假设为异常分配的内存分配方式与所有其他对象(在堆上)分配方式相同。 这曾经是个问题,因为您不能为OutOfMemoryError分配内存,这就是直到Java 1.6之前 才没有堆栈跟踪的原因。现在,它们也为stacktrace预分配了空间。 如果您想知道在抛

  • 异常Exception 以传统的try,catch抓取异常 如果在业务层不catch,框架层会捕捉,并返回一个500的server error响应。 如果在开发环境会返回一个500的具体错误的trace响应。 try { throw new \Exception("Error Processing Request", 1); //yield throwExc

  • 因为Java编程语言不需要捕获方法或声明未检查异常(包括 RuntimeException、Error及其子类),程序员可能会试图编写只抛出未检查异常的代码,或使所有异常子类继承自RuntimeException。这两个快捷方式都允许程序员编写代码,而不必担心编译器错误,也不用担心声明或捕获任何异常。虽然这对于程序员似乎很方便,但它避开了捕获或者声明异常的需求,并且可能会导致其他人在使用您的类而产

  • 当面对选择抛出异常的类型时,您可以使用由别人编写的异常 - Java平台提供了许多可以使用的异常类 - 或者您可以编写自己的异常类。 如果您对任何以下问题回答“是”,您应该编写自己的异常类;否则,你可以使用别人的。 你需要一个Java平台中没有表示的异常类型吗? 如果用户能够区分你的异常与由其他供应商编写的类抛出的异常吗? 你的代码是否抛出不止一个相关的异常? 如果您使用他人的例外,用户是否可以访

  • 异常 对于异常处理,倾向使用 raise 而不是 fail。 # 差 fail SomeException, 'message' # 好 raise SomeException, 'message' 不要在带双参数形式的 raise 方法中显式指定 RuntimeError。 # 差 raise RuntimeError, 'message' # 好 - 默认就是 RuntimeError rai

  • 在Java语言中,是使用“异常(exception)”来处理错误及其他异常事件。术语“异常”是短语“异常事件(exceptional event)”的缩写。 异常是在程序执行期间发生的事件,它会中断程序指令的正常流程。 当在方法中发生错误时,该方法创建一个对象并将其移交给运行时系统。 该对象称为“异常对象(exception object)”,包含有关错误的信息,包括错误发生时其类型和程序的状态。