2017-09-24 86 views
1

我知道「對象」是所有對象的超類,但爲什麼不直接返回類型「classname」呢?爲什麼hibernate的get(classname,index)返回一個對象而不是「classname」實例?

爲什麼Hibernate ORM讓我們做演員?

特別是,我讀了Hibernate返回一個「代理類」,所以懶惰加載可以用來節省內存(和時間),我們如何獲得一個「代理類」,如果我們明顯地做一個演員「真正的」類(而不是代理)?

我的意思是,如果我有例如國家等級:

public class Country { 

    private int id; 
    private String name; 

public int getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

而且與Hibernate我做的:

Country country = (Country) session.get(Country.class, 1); 

我怎樣才能得到一個「代理」,如果我只是做了一個演員到國家?

+0

我很確定代理類擴展你的類 – Sweeper

回答

0

投射不是將特定類型的對象轉換爲不同類型的對象的運行時進程。

鑄造只是建議編譯器返回的對象實際上可以被視爲一個更具體的(如你的情況)。多虧了這一點,你可以使用更詳細的方法/ API。

編譯並運行代碼後,所有的信息都將被廢棄。

+0

知道了!謝謝!我認爲演員實際上正在「轉變」一些東西,但是就像你只是建議編譯器如何處理對象(無論哪個類)那樣,它就更有意義了! – Ric

0

休眠5屆的get方法的簽名是...

<T> T get(Class<T> entityType, Serializable id); 

...這意味着它返回正確的類,並且不使你施放它。這意味着別的東西與你的代碼是「錯誤的」。你使用的是舊版本的Hibernate嗎?

它可能會返回一個代理,在這種情況下,該代理將實際上是您的實體類型的一個子類。

相關問題