第十三章Hibernate一对多关系映射
一对多是在项目开发之中最为常见的一个功能,也就是指在所有的映射里面,一对多设计是首先要思考。例如:现在管理员可以进行新闻的发布,那么一个管理员可以发布多条新闻,这就是一个典型的一对多关系。
范例:数据库创建脚本
-- 使用数据库 USE mldn ; -- 删除数据表 DROP TABLE news ; DROP TABLE admin ; -- 创建数据表 CREATE TABLE admin( adminid VARCHAR(30) , password VARCHAR(32) , CONSTRAINT pk_adminid PRIMARY KEY(adminid) ) ; CREATE TABLE news( nid INT AUTO_INCREMENT , title VARCHAR(30) , pubdate TIMESTAMP , content TEXT , adminid VARCHAR(30) , CONSTRAINT pk_nid PRIMARY KEY(nid) , CONSTRAINT fk_adminid FOREIGN KEY(adminid) REFERENCES admin(adminid) ON DELETE CASCADE ) ; |
在这样的关系之中,取得管理员的时候应该可以取得相应的新闻,也有可能不取得新闻。
13.1、基于*.hbm.xml文件的配置
为项目添加Hibernate支持同时选择好两张数据表并且生成映射。
范例:观察Admin.java类
package cn.cgj.pojo; import java.util.HashSet; import java.util.Set; @SuppressWarnings("serial") public class Admin implements java.io.Serializable { private String adminid; private String password; @SuppressWarnings("rawtypes") private Set newses = new HashSet(0); public Admin() { } //setter、getter略 } |
这种设计是一种最为明显的设计,一个管理员可以发布多条新闻,而所条新闻就使用set集合表示。
范例:观察News.java类
package cn.cgj.pojo; import java.sql.Timestamp; @SuppressWarnings("serial") public class News implements java.io.Serializable { private Integer nid; private Admin admin; private String title; private Timestamp pubdate; private String content; public News() { } //setter、getter略 } |
这种设计在之前的JDBC实现DAO的过程中都有所讲解。POJO类的设计完成之后,下面关键的地方在于配置文件上。
范例:观察admin.hbm.xml文件
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="cn.cgj.pojo.Admin" table="admin" catalog="mldn"> <id name="adminid" type="java.lang.String"> <column name="adminid" length="30" /> <generator class="assigned"></generator> </id> <property name="password" type="java.lang.String"> <column name="password" length="32" /> </property> <!-- 此处定义的集合,表示一对多的关系映射,此处的Admin中的adminid的信息由news维护 --> <set name="newses" inverse="true"> <key> <!-- 两张表之间关联的操作列 --> <column name="adminid" length="30" /> </key> <!-- 在一对多的关系里面,多的一方对应的类型 --> <one-to-many class="cn.cgj.pojo.News" /> </set> </class> </hibernate-mapping> |
范例:观察News.hbm.xml文件
<?xml version="1.0" encoding="utf-8"?> <! |