我正在浏览hibernate文档,文档说hibernate需要一个no-arg构造函数用于所有持久化类:
无参数构造函数是所有持久性的要求 班; Hibernate必须使用Java为您创建对象 反射。构造函数可以是私有的,但是包或公共的 运行时代理生成和高效数据需要可见性 没有字节码检测的检索。
但是当我通过创建一个没有任何no-arg构造函数的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文档中给出的语句,因为文档说我们需要一个无参数的构造函数。我正在使用Hibernate 3.x版本。
答案 0 :(得分:6)
尝试阅读您的活动,您将看到异常。
当通过显式调用构造函数创建了对象时,问题不在于保存数据库中的对象。问题是当hibernate从DB读取记录并且必须创建映射类的相应对象时。在这种情况下,它应该创建对象。没有默认构造函数,怎么做呢?确实可以有几个带参数的构造函数,它“不知道”应该采用哪一个。
所以它做了这样的事情:
Object obj = Class.forName(mappedClassName).newInstance();
pupulateProperties(obj);
newInstance()
需要no-args构造函数。
答案 1 :(得分:1)
你试试这个,然后就会得到例外。
Event event = (Event)session.get(Event.class, eventId );
在事件类中添加默认构造函数
public class Event {
public Event(){
}
}