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了。}
在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了。}
解决方案 »
- hibernate 按时间段更新数据问题
- 定义的Filter有顺序吗
- 倡议全体论坛的会员帖
- 基于ZK框架的开发应用,有人开发过吗?
- 数据库表有记录,但hibernate的session.createQuery返回空值??
- Tomcat 支持jms么?
- 一个冲动的想法(做一个数据库),大家帮帮忙,,,,
- 关于EJB事务的一个问题,如果回答对了,追加分(万分紧急)
- java开发了一个类似发布通知的模块,字符串太长怎么处理?
- 请教weblogic配置,providerURL=t3://localhost:7001 是什么意思?
- 一个WEB开发的时间处理的问题
- weblogic下,在执行一个JSP的时候的奇怪问题!!!!!!
文章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;
========================================
我表达可能不是那么好,不过已经尽力了,希望你的明白,也可以和我交流。
Article的集合删掉,就是下面的语句,leonguo_1986这位同志也很清楚的说明了。
private Set article = new HashTable(0);(set,get方法相应的信息也删掉)