楼主的做法没错啊?按你的配置,我测试通过了,SQL如下:Hibernate: insert into T_User (userName, password, id) values (?, ?, ?)
Hibernate: insert into T_Address (descr, id) values (?, ?)
Hibernate: select user0_.id as id0_, user0_.userName as userName1_0_, user0_.password as password1_0_, user0_1_.descr as descr2_0_ from T_User user0_ inner join T_Address user0_1_ on user0_.id=user0_1_.id where user0_.id=?你所说的“上面的映射文件生成的SQL如下”,是怎么得到转译后的Sql的?

解决方案 »

  1.   

    顺便说下,我是用的hibernate3.x
      

  2.   

    你是T_User表joinT_Address表吧,T_User表是主表,T_Address表是从表,这样没问题,Hibernate参考文档也是这么实例的。但是如果T_Address是主表,T_User是从表(比如User有很多个,但Address仅有几个,User对Address是多对一的关系,且不想把Address单独作为实体,而是作为User的一个属性--这个例子不大恰当,但是可以说明问题。具体实例看我上面列举的ROAD_SECTION表和JAM_CONFIG表)T_User表有个外键字段address_id关联到主表T_Address的主键id上。这种情况我就解决不了了,你看看能不能配置好?
    btw:我上面的SQL是我转译后的(查找->替换),Hibernate生成的SQL不大好看明白:)
      

  3.   

    晕,才看到
    你的表:
    JAM   <fk>  ────→ID  <pk>
    而实体类是这样:
    String  jam;  //  即JAM_CONFIG的DESC字段  你是不是只想查询的时候让RoadSectionStatus的属性jam映射到JAM_CONFIG表中的DESC字段啊,但是save or update的时候怎么办呢..又不想映射JAM_CONFIG表,好古怪的要求,使用many-to-one很容易解决的问题...
    看看文档先
      

  4.   

    使用 <join> 元素,可以将一个类的属性映射到多张表中。
    ----
    可以肯定,join是无法满足你的要求的。另外,按照现在的映射方式,你打算如何修改某个RoadSectionStatus对象的属性JAM_CONFIG....
      

  5.   

    我这个RoadSectionStatus是只读的,配置文件中class的mutable="false",所以不涉及修改时的问题(需要指明一点的是,我前面指明了这个数据库系统是legacy的,即无法重新修改表结构)。配置表JAM_CONFIG的记录也基本上是固定的,仅仅是把状态量0、1、2……转换成“通畅”、“拥堵”、“堵塞”……之类的文字,而且它是一个通用表,即其它的表也可能会引用到。我在看Hibernate的参考文档时看见join能把一个类的属性映射到多张表,所以才会考虑能否做到这种映射。如果实在不行,就只能把JAM_CONFIG单独作为一个实体类了,使用<many-to-one>进行映射,但总觉得这个实体类是多余的……不知大家还有没有更好的办法,谢谢!