2013-10-20 205 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(){ 
    } 

}