2

我正在浏览休眠文档,文档说休眠需要我们所有持久类的无参数构造函数:

无参数构造函数是所有持久类的要求;Hibernate 必须使用 Java 反射为您创建对象。构造函数可以是私有的,但是运行时代理生成和高效的数据检索需要包或公共可见性,而无需字节码检测。

但是当我通过创建一个没有任何无参数构造函数的 POJO 类并通过放置一个带参数的构造函数来创建一个用于测试的示例程序时,我预计 Hibernate 会抛出一个异常,但我惊讶地发现我没有收到异常。

这是我的 POJO:

public class Event {
    private Long id;

    private String title;

    public Event(String title) {}

    public Long getId() {
        return id;
    }

    private void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

这是我的程序:

import org.hibernate.Session;
import java.util.*;
import org.hibernate.tutorial.domain.Event;
import org.hibernate.tutorial.util.HibernateUtil;

public class EventManager {
    public static void main(String[] args) {
        EventManager mgr = new EventManager();
        mgr.createAndStoreEvent("My Event", new Date());
        HibernateUtil.getSessionFactory().close();
    }

    private void createAndStoreEvent(String title, Date theDate) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Event theEvent = new Event("");
        theEvent.setTitle(title);
        theEvent.setDate(theDate);
        session.save(theEvent);
        session.getTransaction().commit();
    }
}

我还配置了休眠配置和映射文件。现在,当我执行这个程序时,我可以看到一条新记录存储在我的数据库中。

我是 Hibernate 的新手,请帮助我理解 hibernate 文档中给出的声明,因为文档说我们需要一个无参数构造函数。我正在使用 Hibernate 3.x 版本。

4

2 回答 2

6

尝试阅读您的活动,您将看到异常。

当对象已经通过构造函数的显式调用创建时,问题不在于将对象保存在数据库中。问题是当休眠从数据库读取记录并且必须创建映射类的相应对象时。在这种情况下,它应该创建对象。没有默认构造函数怎么办?事实上,可以有几个带参数的构造函数,它“不知道”取哪一个。

所以它做了这样的事情:

Object obj = Class.forName(mappedClassName).newInstance();
pupulateProperties(obj);

newInstance()需要无参数构造函数。

于 2013-10-20T17:46:20.290 回答
1

你试试这个然后你会得到例外。

   Event  event = (Event)session.get(Event.class, eventId );

在事件类中添加默认构造函数

public class Event {

     public Event(){
     } 

}
于 2013-10-20T17:45:47.943 回答