2017-09-24 61 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吗?

它可能会返回一个代理,在这种情况下,该代理将实际上是您的实体类型的一个子类。

相关问题