Hibernate 多态查询,如何得到具体子类实例
悬赏:10 发布时间:2008-07-03 提问人:steven_cheng (初级程序员)
我在应用中有一个多态影射,使用的是一个类层次结构一张表的形式。也就是多个类影射到一张表上。
现在用load方法load一个实例,因为这个实例的具体子类型我是知道的,可是无法访问具体子类的属性。我看了,Hibernate给我的是基类的一个proxy,而不是具体子类型的proxy,我希望能得到具体子类型的实例,该怎么做?或者说,load基类无法做到?那在多态查询里拿到的都是基类实例?这样的多态查询有啥用?
问题补充:
汗一个,我居然忘了,除了load还可以get,get是不用proxy的。
还是谢谢热心朋友的回复。
现在用load方法load一个实例,因为这个实例的具体子类型我是知道的,可是无法访问具体子类的属性。我看了,Hibernate给我的是基类的一个proxy,而不是具体子类型的proxy,我希望能得到具体子类型的实例,该怎么做?或者说,load基类无法做到?那在多态查询里拿到的都是基类实例?这样的多态查询有啥用?
问题补充:
汗一个,我居然忘了,除了load还可以get,get是不用proxy的。
还是谢谢热心朋友的回复。
采纳的答案
2008-07-03 wangxin0072000 (高级程序员)
这篇blog是我翻译的Hibernate官方网站的最佳实践。有参考意义。应该可以解决你的问题。
http://wangxin0072000.javaeye.com/admin/blogs/195016
http://wangxin0072000.javaeye.com/admin/blogs/195016
提问者对于答案的评价:
似乎你的映射并没有subclass。不过没关系了,用get就可以了,不用load
其他回答
不好意思,刚刚地址错了。是这个
http://wangxin0072000.javaeye.com/blog/195016
http://wangxin0072000.javaeye.com/blog/195016
wangxin0072000 (高级程序员) 2008-07-03
主要是你的配置文件可能写的有问题。子类与父类之间的关系也要标记上。我blog中都有。摘抄一些例子给你,你看看吧:
父类:
子类:
这是java码:
父类:
<class name="DocumentInfo" table="DOCUMENTS">
<id name="key" type="long" column="ID">
<generator class="native"/>
</id>
<property name="name"/>
<property name="created"/>
<property name="updated"/>
<many-to-one name="folder"/>
</class>
子类:
<class name="Document" table="DOCUMENTS" polymorphism="explicit">
<id name="key" type="long" column="ID">
<generator class="native"/>
</id>
<property name="name"/>
<property name="created"/>
<property name="updated"/>
<many-to-one name="folder"/>
<property name="text"/>
</class>
这是java码:
public class DocumentInfo implements Node {
private Long _key;
private String _name;
private Calendar _created;
private Calendar _updated;
private Folder _folder;
private Clob _text;
public String getKey() { return _key; }
public void setKey(Long key) { _key = key; }
public String getName() { return _name; }
public void setName(String name) { _name = name; }
public Calendar getCreated() { return _created; }
public void setCreated(Calendar created) { _created = created; }
public Calendar getUpdated() { return _updated; }
public void setUpdated(Calendar updated) { _updated = updated; }
public Folder getFolder() { return _folder; }
public void setFolder(Folder folder) { _folder = folder; }
}
public class Document extends DocumentInfo {
private Clob _text;
public Clob getText() { return _text; }
public void setText(Clob text) { _text = text; }
}
wangxin0072000 (高级程序员) 2008-07-03




