2013-10-20 138 views
2

我正想通过Hibernate文档和文件说,休眠,需要我们所有的持久化类无参数的构造函数:Hibernate的无参数的构造函数

的无参数的构造是所有的持久 要求班; 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文档中给出的语句,因为文档说我们需要一个无参数构造函数。我正在使用Hibernate 3.x版本。

+2

如果您尝试从数据库读取对象,该怎么办? –

回答

6

尝试

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

添加默认的构造函数读取您的活动,你会看到除外。

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

所以它是这样的:

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

newInstance()要求使用无参数的构造函数。

1

你试试这一个,那么你会得到例外。在你的事件类

public class Event { 

    public Event(){ 
    } 

}