你没有指明是谁等于ddf。

解决方案 »

  1.   

    Manager m=(Manager)session.get("hbm2.Manager.MAccount", "ddf");
      

  2.   

    这种方式我用过,一点问题都没有的,你看看是不是第一个参数写错了entityname?
    或者MAccount不是主键,第二个参数是指定主键的值。
      

  3.   

    首先,谢谢各位的回答。
    Saro(三生) 这个用法我也确实用过,但是针对hbm2.Manager这个实体就是查不到结果。
    我单独建立了一个独立的表做测试,也没有问题。
    我现在怀疑,session.get()和query的查询机制不一样造成的,但是不知道他们直接到底那里不一样造成的这个结果。ps:Manager这个表跟几个表有外键关联,我在hbm.xml中把这些关联映射都给去了。下面是我的xml文件
      

  4.   

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2006-2-23 15:36:33 by Hibernate Tools 3.1.0.beta4 -->
    <hibernate-mapping>
        <class name="hbm2.Manager" table="MANAGER" schema="ADSL" lazy="false">
            <id name="MAccount" type="string">
                <column name="M_ACCOUNT" length="20" />
                <generator class="assigned" />
            </id>
            <!-- many-to-one name="branch" class="hbm2.Branch" fetch="select">
                <column name="BRANCHID" precision="22" scale="0" />
            </many-to-one>
            <many-to-one name="manatype" class="hbm2.Manatype" fetch="select">
                <column name="M_TYPE" precision="22" scale="0" not-null="true" />
            </many-to-one-->
            <property name="MEmail" type="string">
                <column name="M_EMAIL" length="50" not-null="true" />
            </property>
            <property name="MRight" type="string">
                <column name="M_RIGHT" length="2000" not-null="true" />
            </property>
            <property name="MRegtime" type="timestamp">
                <column name="M_REGTIME" length="7" not-null="true" />
            </property>
            <property name="MStatus" type="char">
                <column name="M_STATUS" length="1" not-null="true" />
            </property>
            <property name="MModifytime" type="string">
                <column name="M_MODIFYTIME" length="20" />
            </property>
            <property name="MOnsale" type="big_decimal">
                <column name="M_ONSALE" precision="3" scale="1" />
            </property>
            <property name="tree" type="string">
                <column name="TREE" length="2000" />
            </property>
            <!-- set name="cusers" inverse="true">
                <key>
                    <column name="M_ACCOUNT" length="20" />
                </key>
                <one-to-many class="hbm2.Cuser" />
            </set>
            <set name="agentInfos" inverse="true">
                <key>
                    <column name="M_ACCOUNT" length="20" not-null="true" unique="true" />
                </key>
                <one-to-many class="hbm2.AgentInfo" />
            </set-->
        </class>
    </hibernate-mapping>
      

  5.   

    那可能就是是属性的大小写问题了,把MAccount改成maccount试试,相应的getter、setter方法也改掉getMaccount/setMaccount
      

  6.   

    我试了一下,不是大小写的问题。
    运行时的log如下:2006-03-21 13:29:15 [org.hibernate.loader.Loader]-[DEBUG] loading entity: [hbm2.Manager#263]
    2006-03-21 13:29:15 [org.hibernate.jdbc.AbstractBatcher]-[DEBUG] about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
    2006-03-21 13:29:15 [org.hibernate.SQL]-[DEBUG] select manager0_.M_ACCOUNT as M1_55_0_, manager0_.M_PASSWORD as M2_55_0_, manager0_.M_PHONE as M3_55_0_, manager0_.M_EMAIL as M4_55_0_, manager0_.PARENTMANAGERID as PARENTMA5_55_0_, manager0_.M_RIGHT as M6_55_0_, manager0_.M_REGTIME as M7_55_0_, manager0_.M_STATUS as M8_55_0_, manager0_.M_MODIFYTIME as M9_55_0_, manager0_.M_ONSALE as M10_55_0_, manager0_.M_NAME as M11_55_0_, manager0_.BUSI_CODE as BUSI12_55_0_, manager0_.TREE as TREE55_0_ from ADSL.MANAGER manager0_ where manager0_.M_ACCOUNT=?
    Hibernate: select manager0_.M_ACCOUNT as M1_55_0_, manager0_.M_PASSWORD as M2_55_0_, manager0_.M_PHONE as M3_55_0_, manager0_.M_EMAIL as M4_55_0_, manager0_.PARENTMANAGERID as PARENTMA5_55_0_, manager0_.M_RIGHT as M6_55_0_, manager0_.M_REGTIME as M7_55_0_, manager0_.M_STATUS as M8_55_0_, manager0_.M_MODIFYTIME as M9_55_0_, manager0_.M_ONSALE as M10_55_0_, manager0_.M_NAME as M11_55_0_, manager0_.BUSI_CODE as BUSI12_55_0_, manager0_.TREE as TREE55_0_ from ADSL.MANAGER manager0_ where manager0_.M_ACCOUNT=?
    2006-03-21 13:29:15 [org.hibernate.jdbc.AbstractBatcher]-[DEBUG] preparing statement
    2006-03-21 13:29:15 [org.hibernate.type.StringType]-[DEBUG] binding '263' to parameter: 1
    2006-03-21 13:29:15 [org.hibernate.jdbc.AbstractBatcher]-[DEBUG] about to open ResultSet (open ResultSets: 0, globally: 0)
    2006-03-21 13:29:15 [org.hibernate.loader.Loader]-[DEBUG] processing result set
    2006-03-21 13:29:15 [org.hibernate.loader.Loader]-[DEBUG] done processing result set (0 rows)
    2006-03-21 13:29:15 [org.hibernate.jdbc.AbstractBatcher]-[DEBUG] about to close ResultSet (open ResultSets: 1, globally: 1)
    2006-03-21 13:29:15 [org.hibernate.jdbc.AbstractBatcher]-[DEBUG] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    2006-03-21 13:29:15 [org.hibernate.jdbc.AbstractBatcher]-[DEBUG] closing statement
    2006-03-21 13:29:15 [org.hibernate.loader.Loader]-[DEBUG] total objects hydrated: 0
      

  7.   

    找到问题了,这个情况不是hibernate自身的问题,是因为我的主键字段m_account在oracle设置的字段类型是char(20),当长度不足20的时候,数据库会自动用空格填满,这样的话这条记录的主键就变成了一个20长度的字符串了。
    所以在用session.get的时候,需要完全匹配的id才行。请问大家hibernate中用没有方案来解决这个问题?
    说白了,就是主键空格问题。
      

  8.   

    char or varchar2?
    是静安寺不是道明寺,是源程序不是言承旭;是在静安寺写源程序,不是在流星花园看F4。
      

  9.   

    原来是oracle,这个问题我也碰到过的,当时搞得一头雾水.其实最好的方法就是所有字符串字段都用varchar,nvarchar就好了,要用hibernate来解决的话,我想写个loadlistener应该可以。public void onLoad(LoadEvent event, LoadEventListener.LoadType loadType) throws HibernateException {
    if ( event.getEntityClassName().equals("hbm2.Manager") ){
       String entityId=event.getEntityId(Serializable entityId) 
        entityId=....//长度不足20,补足空格。
       event.setEntityId(entityId) 
      }
    }
    我没用过event, 你试试看
      

  10.   

    hamlet3145(蛤蟆乐天)  你的禅语俺不太明白,啥意思啊
    Saro(三生) 现在我的数据库是改动不了了,只能通过hibernate来解决这个问题。
    如果按照你写listener的话有几个问题啊第一,需要对数据库中所有char类型的主键的表都要做补足长度操作
    第二,如果数据库的字段长度变化的话,程序也需要变化才行。
    第三,补足操作会影响效率我是想hibernate应该有现成的方案来解决这个问题吧,不知道是不是我太理想化了。
    我觉得这个问题应该好多用oracle的人都遇到过吧,呵呵
      

  11.   

    第二,如果数据库的字段长度变化的话,程序也需要变化才行。
    呵呵,遗留系统啊,设计的不规范就是害死人。如果字段长度变化的话,乘机改成varchar2不就得了。第一,需要对数据库中所有char类型的主键的表都要做补足长度操作
    第三,补足操作会影响效率
    --------------------
    这是没办法的事,你就是用jdbc也必须在传递查询参数时手工补足长度不是,hibernate是不区分varchar和char的,它也不可能知道你在查询那些表时需要去补足字串长度,所以现成的方案是不可能的事情。在dao里面手工补足啦,或者用aop对dao的方法进行拦截也行....其实和hibernate的event的思想一样的,集中在一个地方处理同样的逻辑。
      

  12.   

    谢谢三生
    我按照你的想法用event试一试,再次感谢ing