LZ是不是没在SQL里建关系图呀?是one to many 的关系。一个文章类别中可以包含多片文章。
在Article 会有ArticleCatalog 的实例。private ArticleCatalog catalog
在ArticleCatalog 里会有 Article的集合。private Set article = new HashTable(0);查询的话
string hql = "From Article where ...."
Query query = Session.createQuery(hql);
List lst = query.list();for(int i=0;i<lst.size();i++) {
    Article a = new Article();
    a = lst.get(i);
...再从 a 里面取得ArticleCatalog 的实体。就OK了。}

解决方案 »

  1.   

    <<<<<文章信息>>>>>
    文章ID       int  《主键》
    文章标题     varchar(200)
    文章类别ID   int   《外键》
    发布人       varchar(200)
    文章内容     text
    发布日期     datetime
    其它的一些字段.....<<<<<文章类别信息>>>>>
    文章类别ID   int    《主键》
    类别名称     varchar(100)
    类别描述     varchar(2000)首先你的表的关系设好后,用Hibernate自动生成POJO的映射文件(生成的时候要选中两个表一起生成)
    因此,看了楼主的代码,楼主的Article.hbm.xml,ArticleCatalog.hbm.xml这两个文件估计是单个去生成的,所以Hibernate没帮你生成映射关系。
    如果是选中两个表同时生成POJO映射文件,Hibernate会帮你生成一个双向的关系(一般是两个表都有many-to-one),这里注意了:如果你搞不清关系,那你并不需要修改映射关系程序也不会有什么错误,但是,我们一般需要按照常理修改。
    按常理来说,一个文章信息只有一个文章类别信息。
                一个文章类别会对应多个文章信息。因此,对于 文章信息----》文章类别信息 是多对一的关系(many-to-one)
    反过来,对于  文章类别信息----》文章信息  是一对多的关系(one-to-many)按常理来说,对于类别信息,它并不需要知道文章是什么,但是文章却知道它是什么类别。
    因此我们只需要配置单项的关系(Hibernate默认生成的双项关系)。因此我们一般在Article.hbm.xml中设
    (many-to-one)的关系就可以了,而ArticleCatalog.hbm.xml不需要任何设置。========================================
    你的另外一个问题
    private Integer id;//文章编号private String title;//文章标题private Integer catalogId;
             //文章类别编号,我这里是不是写错了???应该是???希望说明一下
             //private ArticleCatalog catalog;上面你写的注释其实才是真正的答案,原因就是因为你生成POJO的时候的没有同时选两个表,所以造成了Hibernate不能检测它们的关系。我这里有个建表的语句,你可以模仿,我加上了简单的注释:
    ec_product是产品表,ec_category是类别表。情况和你那个几乎一样。
    ec_product的product_id(产品ID)为主键,category_id(类别ID)作为外键
    ec_category的主键是category_id=========================================================================
    DROP TABLE IF EXISTS `ec_product`;
    CREATE TABLE `ec_product` (
      `product_id` int(11) NOT NULL,
      `product_name` varchar(64) NOT NULL,
      `product_desc` varchar(6000) default NULL,
      `baseprice` double NOT NULL,
      `category_id` int(11) default NULL,
      `writer` varchar(32) default NULL,
      `publisher` varchar(64) default NULL,
      `pages` decimal(8,0) default NULL,
      `images` varchar(100) default NULL,
      PRIMARY KEY  (`product_id`)
    );
    DROP TABLE IF EXISTS ec_category;
    CREATE TABLE ec_category(
      `category_id` int(11) NOT NULL,
      `category_name` varchar(16) NOT NULL,
      `category_desc` varchar(100) default NULL,
      PRIMARY KEY  (`category_id`)
    );下面是关联语句,我把它分离出来比较容易看,不多说了
    alter table ec_product add foreign key(category_id) references ec_category(category_id);========================EcProduct.hbm.xml===============================
    <hibernate-mapping>
        <class name="com.canning.vo.EcProduct" table="ec_product">
            <id name="productId" type="java.lang.Integer">
                <column name="product_id" />
                <generator class="increment" />
            </id>
            <!--这里配多对一的映射就行了,因为一个类别信息对应多个产品-->
            <!--因此对于 产品信息----->类别信息 是多对一的关系,是单项的-->
            <many-to-one name="ecCategory" class="com.tarena.vo.EcCategory" fetch="select" lazy="false">
                <column name="category_id" />
            </many-to-one>
            <property name="productName" type="java.lang.String">
                <column name="product_name" length="64" not-null="true" />
            </property>
            <property name="productDesc" type="java.lang.String">
                <column name="product_desc" length="6000" />
            </property>
            <property name="baseprice" type="java.lang.Double">
                <column name="baseprice" precision="22" scale="0" not-null="true" />
            </property>
            <property name="writer" type="java.lang.String">
                <column name="writer" length="32" />
            </property>
            <property name="publisher" type="java.lang.String">
                <column name="publisher" length="64" />
            </property>
            <property name="pages" type="java.lang.Long">
                <column name="pages" precision="8" scale="0" />
            </property>
            <property name="images" type="java.lang.String">
                <column name="images" length="100" />
            </property>
        </class>
    </hibernate-mapping>=======================EcCategory.hbm.xml============================
    <hibernate-mapping>
        <class name="com.canning.vo.EcCategory" table="ec_category">
            <id name="categoryId" type="java.lang.Integer">
                <column name="category_id" />
                <generator class="increment" />
            </id>
            <!--类别信息并不需要知道产品,产品去找类别就行了-->
            <!--因此这里不用配置映射关系-->
            <property name="categoryName" type="java.lang.String">
                <column name="category_name" length="16" not-null="true" />
            </property>
            <property name="categoryDesc" type="java.lang.String">
                <column name="category_desc" length="100" />
            </property>
        </class>
    </hibernate-mapping>==============================EcProduct.java==============
         private Integer productId;
         private EcCategory ecCategory;//qichunren () 你注意看这里,Hibernate会自动生成
         private String productName;   //这回明白了吧 
         private String productDesc;
         private Double baseprice;
         private String writer;
         private String publisher;
         private Long pages;
         private String images;
    ========================================
    我表达可能不是那么好,不过已经尽力了,希望你的明白,也可以和我交流。    
      

  2.   

    忘记说了,Hibernate在两个表中都生成了映射关系,对于你的情况,只要把ArticleCatalog.hbm.xml中的映射关系的信息去掉即可,还有将ArticleCatalog.java中关于
    Article的集合删掉,就是下面的语句,leonguo_1986这位同志也很清楚的说明了。
    private Set article = new HashTable(0);(set,get方法相应的信息也删掉)