我试了一下,不是大小写的问题。 运行时的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
或者MAccount不是主键,第二个参数是指定主键的值。
Saro(三生) 这个用法我也确实用过,但是针对hbm2.Manager这个实体就是查不到结果。
我单独建立了一个独立的表做测试,也没有问题。
我现在怀疑,session.get()和query的查询机制不一样造成的,但是不知道他们直接到底那里不一样造成的这个结果。ps:Manager这个表跟几个表有外键关联,我在hbm.xml中把这些关联映射都给去了。下面是我的xml文件
<!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>
运行时的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
所以在用session.get的时候,需要完全匹配的id才行。请问大家hibernate中用没有方案来解决这个问题?
说白了,就是主键空格问题。
是静安寺不是道明寺,是源程序不是言承旭;是在静安寺写源程序,不是在流星花园看F4。
if ( event.getEntityClassName().equals("hbm2.Manager") ){
String entityId=event.getEntityId(Serializable entityId)
entityId=....//长度不足20,补足空格。
event.setEntityId(entityId)
}
}
我没用过event, 你试试看
Saro(三生) 现在我的数据库是改动不了了,只能通过hibernate来解决这个问题。
如果按照你写listener的话有几个问题啊第一,需要对数据库中所有char类型的主键的表都要做补足长度操作
第二,如果数据库的字段长度变化的话,程序也需要变化才行。
第三,补足操作会影响效率我是想hibernate应该有现成的方案来解决这个问题吧,不知道是不是我太理想化了。
我觉得这个问题应该好多用oracle的人都遇到过吧,呵呵
呵呵,遗留系统啊,设计的不规范就是害死人。如果字段长度变化的话,乘机改成varchar2不就得了。第一,需要对数据库中所有char类型的主键的表都要做补足长度操作
第三,补足操作会影响效率
--------------------
这是没办法的事,你就是用jdbc也必须在传递查询参数时手工补足长度不是,hibernate是不区分varchar和char的,它也不可能知道你在查询那些表时需要去补足字串长度,所以现成的方案是不可能的事情。在dao里面手工补足啦,或者用aop对dao的方法进行拦截也行....其实和hibernate的event的思想一样的,集中在一个地方处理同样的逻辑。
我按照你的想法用event试一试,再次感谢ing