many-to-one进行类关联的问题

在使用hibernate进行类关联的时候,通常采用如下的做法:

 

<class
            name="org.appfuse.task.model.Advertisement"
            table="advertisement_t"
    >
...
        <many-to-one
            name="resource"
                    class="org.appfuse.task.model.Resource"
                    column="resource_id"
                cascade="all"
        >

 

但是假设我们Resource对于不同的资源需要进行构造不同的子类,比如ImageResource, TextResource, HtmlResource, etc. 在web进行不同资源展现的时候,就需要针对不同资源进行不同的展现。

此时,如果直接访问某个字类的属性,就会告知没有这个属性。通过在webcontroller跟踪advertisement对象的resource属性可以发现,它不是某个字类的对象,它是Resource$EnhancerbyCglib!通过查询hibernate的文档,原来这是hibernate的many-to-one的配置:

lazy (optional - defaults to proxy): By default, single point associations are proxied. lazy="no-proxy" specifies that the property should be fetched lazily when the instance variable is first accessed (requires build-time bytecode instrumentation). lazy="false" specifies that the association will always be eagerly fetched.

原来默认的情况下使用proxy方式连接,这时候产生的不是实际的类,而是cglib代理类。只有对他的属性进行访问的时候,才会构造真正的实际类。

解决方法很简单,在many-to-one配置中增加lazy=false,就可以在页面中直接访问各子类的特殊属性啦。

 

相关文章:http://www.wangchao.net.cn/bbsdetail_925021.html

 

你可能感兴趣的:(Hibernate,mvc,orm,配置管理,Appfuse)