两张表之间如果存在外键,就会出现一对多关系(外键不能同时是主键)
如果想使用pojo类来表示一对多关系,这里以省份和城市为例:
省份类中应该包含多个城市的对象,一般默认使用Set集合表示某个省份下多个城市
城市类中应该包含一个省份的对象。
如果在表中存在外键,且使用MyEclipse一起选择两张表生成映射,则会自动生成出一对多关系。
先建立省份和城市表。
CREATE TABLE province ( id number(8) primary key , title varchar2(50) not null ); INSERT INTO province VALUES (1,'江苏'); INSERT INTO province VALUES (2,'广东'); INSERT INTO province VALUES (3,'河南'); CREATE TABLE city ( id number(8) primary key , title varchar2(50) not null, province_id number(8) , foreign key (province_id) references province (id) on delete cascade ); INSERT INTO city VALUES (1,'南通¨',1); INSERT INTO city VALUES (2,'南京',1); INSERT INTO city VALUES (3,'苏州',1); INSERT INTO city VALUES (4,'广州',2); INSERT INTO city VALUES (5,'深圳',2); INSERT INTO city VALUES (6,'洛阳',3); INSERT INTO city VALUES (7,'南阳',3); COMMIT;
生成映射:
public class Province implements java.io.Serializable { private Integer id; private String title; private Set cities = new HashSet(0); public class City implements java.io.Serializable { private Integer id; private Province province; private String title;
通过映射文件描述了这种一对多关系。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.liky.primary.pojo.Province" table="PROVINCE" schema="SUNXUN"> <id name="id" type="java.lang.Integer"> <column name="ID" precision="8" scale="0" /> <generator class="increment" /> </id> <property name="title" type="java.lang.String"> <column name="TITLE" length="50" not-null="true" /> </property> <!-- 在Province中存在一个名称为cities的Set集合 --> <set name="cities" inverse="true"> <!-- 关联外键是PROVINCE_ID --> <key> <column name="PROVINCE_ID" precision="8" scale="0" /> </key> <!-- 表示当前类(Province)与City类存在一对多关系 --> <one-to-many class="org.liky.primary.pojo.City" /> </set> </class> </hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.liky.primary.pojo.City" table="CITY" schema="SUNXUN"> <id name="id" type="java.lang.Integer"> <column name="ID" precision="8" scale="0" /> <generator class="increment" /> </id> <!-- </many-to-one> <property name="title" type="java.lang.String"> <column name="TITLE" length="50" not-null="true" /> </property> </class> </hibernate-mapping>
Inverse="true"表示:关联关系反转,也就是关联关系由对方进行维护。
关联关系在这里指的是外键字段province_id,该字段是city表的,也就是说修改city表,才可以修改这个字段,也就可以说city表维护着关联关系。对于Province来说,对方就是city,也就是说关联关系由对方(city)来维护。
public static void main(String[] args) { City c = (City) HibernateSessionFactory.getSession()。get(City.class, 5); System.out.println(c.getTitle()); System.out.println(c.getProvince()。getTitle()); }
通过这段测试,可以看出fetch的作用
使用get或load方法按主键查询时,如果fetch="select",是懒汉式加载,先查询出城市信息,当用到省份信息时,再查询省份。
Fetch="join",则是一次关联查询将省份和城市一起取得。
使用了一对多关系后,Hibernate可以自动根据关联关系,将关联数据取得。
例如:
查询省份,可以自动将所有城市也列表显示出来。
String hql = "FROM Province"; List<Province> allP = HibernateSessionFactory.getSession()。createQuery( hql)。list(); Iterator<Province> iter = allP.iterator(); while (iter.hasNext()) { Province p = iter.next(); System.out.println(p.getTitle()); Iterator<City> iter2 = p.getCities()。iterator(); while(iter2.hasNext()) { City c = iter2.next(); System.out.println(" |- " + c.getTitle()); } }
相关推荐
总的来说,理解并熟练运用Ibatis的一对多关系映射是优化数据访问效率,提高代码可读性和可维护性的重要技能。 在实际开发中,合理地使用Ibatis的一对多关系映射可以避免频繁的数据库查询,提高系统性能。同时,它也...
**一对多关系映射** 在数据库设计中,一对多关系是指一个父记录可以与多个子记录关联,例如,一个用户可以有多个订单。在iBATIS中,我们可以通过配置XML映射文件来实现这种关系。 1. **配置映射文件** 在`ibatis...
为了正确地将一对多关系映射到数据库中,需要在“多”的一端创建外键指向“一”的一端。 - 例如,在员工和部门的关系中,一个部门可以有多个员工。因此,在员工表中添加一个部门ID的外键字段,用来引用部门表中的...
一、一对多关系映射 在现实世界中,一对多关系非常常见,例如一个班级有多名学生,一个部门有多名员工。在EJB3中,我们可以通过`@OneToMany`注解来表示这种关系。以下是一个简单的例子: 1. 定义父类("多"的一方...
在这个名为"MyBatis_关系映射之一对多-src.zip"的压缩包中,我们很显然会探讨MyBatis中的一对多关系映射这一核心概念。 在数据库设计中,一对多关系是常见的实体关系类型,意味着一个父表(或父实体)可以与多个子...
Java Persistence API(JPA)是Java...理解并熟练掌握一对一、一对多和多对多关系映射对于使用JPA进行数据库操作至关重要。在实际开发中,根据业务需求选择合适的关系映射方式,可以极大地提高开发效率和代码可维护性。
本文将深入探讨如何使用MyBatis的注解配置来实现一对多关系映射,以此来提高开发效率并减少代码冗余。 首先,我们需要理解一对多关系的概念。在数据库设计中,一对多关系表示一个表中的记录可以对应另一个表中的多...
2. 一对多关系映射: 一对多(One-to-Many)关系映射是最常见的关系类型,一个实体可以与多个其他实体相关联。在Java中,这通常通过`@OneToMany`注解实现。例如,一个教师可以教授多门课程,Teacher类和Course类...
2. **一对多关系映射** - 单向:在一方实体类中定义一个集合类型属性,使用`@OneToMany`注解,可通过`@JoinColumn`或`@JoinTable`指定关联方式。 - 双向:一方实体有集合属性,另一方实体有对一方的引用,两者都...
二、一对多关系映射(One-to-Many) 在一个实体中,如果一个实例可以对应多个其他实体的实例,这就是一对多关系。在Hibernate中,我们使用`@OneToMany`注解来表示。例如,一个部门可以有多个员工,Department类和...
在MyBatis中,我们可以使用Collection类型来实现一对多关系映射。下面是一个简单的示例: 用户实体: ```java public class Person { private String personid; private String personname; private String ...
5. **一对多关系映射**:在“论坛”相关的例子中,很可能是用户(User)与帖子(Post)之间的一对多关系。通过`@OneToMany`注解在User类上,和`@ManyToOne`注解在Post类上,可以实现这种关系的映射。 6. **多对一...
本篇文章将深入探讨Hibernate中的一对多和多对多关系映射。 首先,让我们理解一对多关联映射。在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联。在Hibernate中,这可以通过在实体类中...
--一对多关系映射 ofType表示属性集合中的元素的类型,List属性即Orders类 --> <!--关联查询sql--> select u.*,o.id as orders_id,o.number from tb_user u,tb_orders o where u.id=o.user_id and ...
在一对多关系映射中,MyBatis通过配置XML映射文件或注解方式,定义了如何从数据库查询和插入关联的数据。例如,我们可以为图书馆定义一个方法来获取其所有的图书。 下面是一对多关系在MyBatis中的配置示例: ```...
##### 3.1 一对多关系映射 一对多关系是指一个实体可以对应多个其他实体的情况。例如,一个部门可以有多个员工。这种情况下,我们通常会在“多”的一方设置外键指向“一”的一方。 ```xml ...
2. 一对多关系映射(One-to-Many) 在一对多关系中,一个实体可以对应多个其他实体的实例。例如,一个班级(Class)可以有多个学生(Student)。使用`@OneToMany`注解可以建立这种关系: ```java @Entity public ...
3. 映射文件:在MyBatis的XML映射文件中,通过`<association>`标签定义一对多关系。`<collection>`子标签用于指定集合属性,`property`表示Java类中的字段名,`select`属性则是用来查询从表数据的SQL语句。 例如: ...