getClass()方法得到的class名称是代理类的名字,也就是Child的名字,我想知道的是怎么区分是Child还是CleverChild

解决方案 »

  1.   

    你自己试一下Child kid = new CleverChild();
    kid.getClass();你Child kid = new Child(); kid.getClass();当然是Child了
      

  2.   

    下面是代码:
    public class Child
    {
        private Long id;
        private Parent parent;
        // ...getter/setter方法略去
    }
    public class CleverChild extends Child
    {
    }
    public class Parent
    {
        private Long id;
        private Child child;
        // getter/setter略去
    }child.hbm.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="Child" table="tblChild" discriminator-value="C">
            <id name="id">
                <generator class="native"/>
            </id>
            <discriminator column="CLASS_TYPE" type="string"/>
            <one-to-one name="parent" class="Parent" property-ref="child"/>
            <subclass name="CleverChild" discriminator-value="CC">
            </subclass>
        </class>
    </hibernate-mapping>parent.hbm.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="small">
        <class name="Parent" table="tblParent">
            <id name="id">
                <generator class="native"/>
            </id>
            <many-to-one name="child" class="Child" column="child_ID" unique="true"/>
        </class>
    </hibernate-mapping>运行代码:
    public static void main(String[] args)
    {
        Configuration configuration = new Configuration();
        SessionFactory sessionFactory = configuration.configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();    Parent parent = (Parent) session.get(Parent.class, new Long(1));
        System.out.println(parent.getChild().getClass());    tx.commit();
        session.close();}
    运行结果:
    class small.Child$$EnhancerByCGLIB$$366f5569数据库中确实是CleverChild
      

  3.   

    单点关联中lazy可以设置:
    lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。
    lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。 
    lazy="false"指定此关联总是被预先抓取。上面这段话是从网上操的,因为不想预先抓取,所以默认了proxy,但是默认的这种情况不知道怎么得到子类的类型?望大牛解答,感激不尽。