复合主键,只有在特定的业务需求的时候才用,而这种业务需求一般是不允许出现 null 值 的。
所以如果出现为空的情况是不适合用复合主键的一般情况下使用代理主键即可。

解决方案 »

  1.   

    <hibernate-mapping> 
         <class name="com.teg.lais.curve.VDcContent" table="V_Dc_Content" schema="YXAQ"> 
              <composite-id name="id" class="com.teg.lais.curve.VDcContentId"> 
                 <key-property name="checi" type="java.lang.String"> 
                     <column name="CHECI" length="10" /> 
                 </key-property> 
                 <key-property name="station" type="java.lang.String"> 
                     <column name="STATION" length="20" /> 
                 </key-property> 
                 <key-property name="time" type="java.lang.String"> 
                     <column name="STATION" length="20" /> 
                 </key-property>
              </composite-id>
         </class> 
    </hibernate-mapping> 如果你的表数据库没有建立主键,Hibernate就会生成这样的将整个记录做为一个composite-id的情况。还有你看红字是你漏掉了还是除了composite-id还有其他field,如果是还有其它Field生成,那我也不清楚了。因为既然是主键那必须非空的,取出来有记录就一定有数据。
      

  2.   

    我觉得用视图的话,把它当成表就可以了不用搞那么复杂,你手写个吧myeclipse生成的就那样.
      

  3.   

    就是不想手动写,不知道hibernante tools支持自动生成指定主键不?
    我手动写了一个:
    <hibernate-mapping>
        <class name="com.teg.lais.curve.VZYxaqOnlinelocoxyId" table="V_Z_YXAQ_ONLINELOCOXY" schema="YXAQ">
                <id name="rowid" type="java.lang.String"> 
             <column name="ROWID" length="20" />
    <generator class="assigned"/> 
        </id>  
             
                <property name="jx" type="java.lang.String">
                    <column name="jx" length="4" />
                </property>
                <property name="jch" type="java.lang.String">
                    <column name="jch" length="4" />
                </property>
                <property name="jcm" type="java.lang.String">
                    <column name="jcm" length="20" />
                </property>
                <property name="time" type="java.util.Date">
                    <column name="time" length="7" />
                </property>
                     
        </class>
    </hibernate-mapping>
    加了一个主键rowid,可以用hql正常查询了:  String hql = "FROM VZYxaqOnlinelocoxyId as p 
      Query q = this.session.createQuery(hql) ;
      List l = q.list() ;
    但是用sql好像又不行了:  String sql = "select * from v_z_yxaq_onlinelocoxy v"; // where v.机车型号=:jx and v.机车号=:jch ";
      Query q = this.session.createSQLQuery(sql);
      List l = q.list();这时跟踪调试可以看到l里有数据,但是用bean的VZYxaqOnlinelocoxyId类型就无法转换了,是不是由于bean里自己添加rowid的问题?如果在sql里加上了
    select v.rowid,v.* from v_z_yxaq_onlinelocoxy v; 调试又报No Dialect mapping for JDBC type 说不是直接映射的。
      

  4.   

    你做视图的时候虚拟个主键比如由两个字段确定一个记录的话主键可以这样select  a||b as id from xxx这样就行了