论坛首页 Java企业应用论坛

为什么我的子类总映射不成功?

浏览 3565 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-03-11  
我在做2个子类同时映射一张表的试验,但是在building session factory时,总是出现下面这个错误:discriminator mapping required for polymorphic persistence。有谁知道为什么?

<hibernate-mapping package="test.hibernate">
    <class name="test.hibernate.Team" table="DB_HQBG..T_TEST_TEAM" polymorphism="explicit">
         <id name="id" type="string" unsaved-value="null">
             <column name="ID" sql-type="char(32);" not-null="true"/>
             <generator class="uuid.hex"/>
        </id>
        <property name="name">
              <column name="NAME" sql-type="char(10);"/>
        </property>
        .......
        <subclass name="TeamInfo">
           <property name="country" type="string">
                 <column name="COUNTRY" sql-type="char(10);"/>
           </property>
           ......
        </subclass>
        <subclass name="test.hibernate.TeamOwner">
             <property name="owner" type="string">
                 <column name="OWNER" sql-type="char(10);"/>
             </property>
             .....
         </subclass>
    </class>
</hibernate-mapping>

   发表时间:2004-03-11  
另外,我在Team中,用到了one-to-one, ont-to-many,和这个有关吗?
0 请登录后投票
   发表时间:2004-03-11  
&lt;id name ="**" column="**"..
没有column元素的
0 请登录后投票
   发表时间:2004-03-11  
我知道原因了,是我没有定义&lt;discriminator&gt;元素。

但是必须在Table中有这么一个相应的列吗?为什么hibernate实例化类需要依赖数据库呢?他不是有polymorphism属性吗?设置成explicit不可以吗?

真让人郁闷,有在实际项目中用subclass的吗?感觉如何?
0 请登录后投票
   发表时间:2004-03-11  
winterchipmunk 写道
我知道原因了,是我没有定义&lt;discriminator&gt;元素。

但是必须在Table中有这么一个相应的列吗?为什么hibernate实例化类需要依赖数据库呢?他不是有polymorphism属性吗?设置成explicit不可以吗?

真让人郁闷,有在实际项目中用subclass的吗?感觉如何?


子类可以有两种映射方式,一种是存放在一张表中的,一种是使用joined subclass。前一种只能在table中设置一个字段来区分不同的子类,后一个就是多个表了。多态的属性表示是否自动返回子类的实例,如果设成explicit就需要你在查询时指定子类的类型.
引用
Implicit (隐式)的多态是指,如果查询中给出的是任何超类、该类实现的接口或者该类的名字,都会返回这个类的实例;如果查询中给出的是子类的名字,则会返回子类的实例。 Explicit (显式)的多态是指,只有在查询中给出的明确是该类的名字时才会返回这个类的实例;同时只有当在这个&lt;class&gt;的定义中作为&lt;subclass&gt;或者&lt;joined-subclass&gt;出现的子类,才会可能返回。 大多数情况下,默认的polymorphism="implicit"都是合适的。 显式的多态在有两个不同的类映射到同一个表的时候很有用。(允许一个“轻型”的类,只包含部分表字段)。
0 请登录后投票
   发表时间:2004-03-12  
谢谢sayor,我在hibernate reference documentation中看过你引用的那段话。所以我感觉可以用explicit的方式来自动识别需要实例化的类,而不需要在字段中指定discriminator。因为当我们查询数据库的时候,就是实例化类的时候,应该已经明确我们需要的子类,而不仅仅是接口或是基类。

我之所以用subclass,而不能用joined-subclass,是因为我要对一张表映射多个类,之所以这样,主要是因为有这种可能:不同权限的人看到表的内容不一样,所以我需要根据不同需求,得到不同的子类实例,即只访问部分字段。而不必每次都放回所有字段内容。

不知道大家都是怎么处理我的上述问题的,请多赐教:)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics