是这样的,今天做项目的时候,碰到一个这样的问题,因为一个PurUser表没有主键,所以生成了两个java文件,一个是PurUser和PurUserId两个java文件//PurGro.java
private String pgid;
private String pgname;
private Set puruserss;//一对多指向无主键表
get/set省略
//PurUser.java
private PurUserId id;
get/set省略
//PurUserId.java
private String staffId;
private String pgid;
get/set/equals/hashCode省略
PurGro.xml<id name="pgid" type="java.lang.String">
  <column name="PGID" length="20" />
  <generator class="assigned" />
</id>
<property name="pgname" type="java.lang.String">
  <column name="PGNAME" length="50" not-null="true" />
</property>
<set name="puruserss" inverse="true" lazy="false">
  <key column="pgid"></key>
  <one-to-many class="PurUser"/>
</set>
PUR_USER.xml <composite-id name="id" class="com.teddy.ssh.dao.PurUserId">
  <key-property name="staffId" type="java.lang.String">
    <column name="STAFF_ID" length="20" />
  </key-property>
  <key-property name="pgid" type="java.lang.String">
    <column name="PGID" length="20" />
  </key-property>
</composite-id>
以下是我做测试的service类 
PurGroService.java public static void main(String[] args) {
  ApplicationContext actx = new ClassPathXmlApplicationContext("applicationContext.xml");//bean.xml为配置文件的名字
  PurGroDAO dao = (PurGroDAO)actx.getBean("purGroDAO");
  PurGro pg = dao.findById("1002");
  System.out.println("======size: " + pg.getPuruserss().size() + "======");
}这里通过HIBERNATE的SQL打印出来,集合的结果为0,我自己在数据库查,有结果. 请问我应该如何解决这个无主键的问题呢?(在其他表一对多的测试,集合有结果,就是这种无主键的查询,集合里面没有数据) 
分数不多,希望各位大大能解答一下小弟的问题,谢谢

解决方案 »

  1.   


    两表关联的表就没有主键阿,A,B表,中间用一个A_B的表做连接两表,这样,这个A_B的表就没有主键阿
      

  2.   

    自己改表 加个主键 或者把2个字段都设置成主键 生成的JAVA文件有两个 或者自己改下虚构函数生成1个JAVA文件就可以用了
      

  3.   


    你好,因为我是初学HIBERNATE,所以想请问一下,如何做你所说的修改,谢谢
      

  4.   

    成功了,终于知道错误在哪里了,现在就把自己分析的原因写下来,总结一下:因为我是用myeclipse 的hibernate自动反向功能生成的PurUser和PurUserId这两个java文件, 
    数据库的PUR_USER所以字段都在PurUserId.java里,而PurUser.java这个文件,只有一个和
    PurUserId.java文件匹配的字段,而在XML文件里面, 数据库PUR_USER字段全部都放到composite-id里应该把不是关联的字段放回到composite-id标签外边,如下(红色部分,之前我只是用自动反向的功能,
    没有自己手动改回去)<class name="com.teddy.ssh.dao.PurUser" table="PUR_USER" schema="WING">
            <composite-id name="id" class="com.teddy.ssh.dao.PurUserId">
                <key-property name="staffId" type="java.lang.String">
                    <column name="STAFF_ID" length="20" />
                </key-property>
                <key-property name="pgid" type="java.lang.String">
                    <column name="PGID" length="20" />
                </key-property>
            </composite-id>
            <property name="creatby">
              <column name="CREATBY"/>
            </property>
            <property name="creatTime">
              <column name="CREAT_TIME"/>
            </property>
            <property name="memo">
              <column name="MEMO"/>
            </property>

    </class>
    还有PurUser和PurUserId这两个java文件,最后应该是这样
    PurUserprivate PurUserId id;
    private String creatby;
    private Date creatTime;
    private String memo;
    get/set省略
    PurUserIdprivate String staffId;
    private String pgid;
    get/set/equals/hashCode省略
    问题解决了