第九章 关系映射 一对多关联映射

简介: <p style="margin-left:0.74cm; margin-bottom:0cm"><span style="color:#000000"><span style="font-size:10px">如:</span><span style="font-family:Times New Roman,serif"><span style="font-family:Helvetic

如:departmentemployee

employee中有一个department_id的外键

Department:

public class Department implements Serializable {
	private Integer id;
	private String name;
	private Set<Employee> employees;

	public Set<Employee> getEmployees() {
		return employees;
	}

	public void setEmployees(Set<Employee> employees) {
		this.employees = employees;
	}

	public Department() {
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}



Employee:

public class Employee implements Serializable {
	private Integer id;
	private String name;

	public Employee() {
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}


Department.hbm.xml:(与普通的映射文件一样)

<hibernate-mapping>
	<class name="cn.framelife.hibernate.entity.Department" table="department"
		catalog="hibernate">
		<id name="id" type="java.lang.Integer">
			<column name="id" />
		</id>
		<property name="name" type="java.lang.String">
			<column name="name" length="45" not-null="true" />
		</property>	
                <set name="employees" inverse="false" cascade="all">
			<key column="department_id"></key>
			<one-to-many class="cn.framelife.hibernate.entity.Employee"/>
		</set>
	</class>
</hibernate-mapping>


Employee.hbm.xml:

<hibernate-mapping>
	<class name="cn.framelife.hibernate.entity.Employee" table="employee"
		catalog="hibernate">
		<id name="id" type="java.lang.Integer">
			<column name="id" />
			<generator class="native"></generator>
		</id>
		<property name="name" type="java.lang.String">
			<column name="name" length="45" not-null="true" />
		</property>	
	</class>
</hibernate-mapping>

增加:

transaction = session.beginTransaction();
			Department department = new Department();
			department.setName("zzza");
			Set<Employee> set = new HashSet<Employee>();
			for(int i=0; i < 5; i++){
				Employee employee = new Employee();
				employee.setName("zz"+i);
				set.add(employee);
			}
			department.setEmployees(set);
			session.save(department);
			transaction.commit();


查询:

查询department的时候可以得到外键关联的所有employee对象。



注意事项:

a、错误提示:Field'department_id' doesn't have a default value
   
数据表中把"department_id"设成可以为空的,但是Hibernate先执行的是:

因为hibernate执行的顺序是这样的:

Hibernate:insert into hibernate.department (name) values (?)

Hibernate:insert into hibernate.employee (name) values (?)

Hibernate:insert into hibernate.employee (name) values (?)

Hibernate:insert into hibernate.employee (name) values (?)

Hibernate:insert into hibernate.employee (name) values (?)

Hibernate:insert into hibernate.employee (name) values (?)

Hibernate:update hibernate.employee set department_id=? where id=?

Hibernate:update hibernate.employee set department_id=? where id=?

Hibernate:update hibernate.employee set department_id=? where id=?

Hibernate:update hibernate.employee set department_id=? where id=?

Hibernate:update hibernate.employee set department_id=? where id=?

department_id外键是作为一个后来才更新的存在。所有不能设置为非空的。


b
Department.hbm.xml中要设置cascade="all"(级联),或其它有效值,不然,在保存Department对象时,相关的Employee对象不会被保存。(none,all,save-update,delete..)


c
Department.hbm.xmlset标签的inverse属性不能设置为"true"放弃维护关联关系),inverse的默认值是"false",所以不加inverse也可以。看书上说:在一对多的关联关系实现中,最好设置inverse="true",将有助于性能的改善。所以一开始就用了inverse="true"UserCard对象都分别正确写入数据库了,但是就是departmentID字段没有被自动写入。


d、多对一与一对多可以一起用,形成双向关系。

      多对一映射的使用:http://blog.csdn.net/p_3er/article/details/9036759


e.one-to-manymany-to-onemany-to-many懒加载分析:

必须同时满足下面的两个条件时才能实现懒散加载:

1).lazy!=false(lazy缺省方式就!=falselazy=proxy)

2).fetch=select(fetch缺省方式即为select)



目录
相关文章
|
1天前
|
云安全 人工智能 自然语言处理
AI说的每一句话,都靠谱吗?
阿里云提供AI全栈安全能力,其中针对AI输入与输出环节的安全合规挑战,我们构建了“开箱即用”与“按需增强”相结合的多层次、可配置的内容安全机制。
|
5天前
|
存储 人工智能 安全
AI 越智能,数据越危险?
阿里云提供AI全栈安全能力,为客户构建全链路数据保护体系,让企业敢用、能用、放心用
|
8天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
3天前
|
消息中间件 安全 NoSQL
阿里云通过中国信通院首批安全可信中间件评估
近日,由中国信通院主办的 2025(第五届)数字化转型发展大会在京举行。会上,“阿里云应用服务器软件 AliEE”、“消息队列软件 RocketMQ”、“云数据库 Tair”三款产品成功通过中国信通院“安全可信中间件”系列评估,成为首批获此认证的中间件产品。此次评估覆盖安全可信要求、功能完备性、安全防护能力、性能表现、可靠性与可维护性等核心指标,标志着阿里云中间件产品在多架构适配与安全能力上达到行业领先水平。
301 192
|
3天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
332 165
|
2天前
|
开发者
「玩透ESA」ESA启用和加速-ER在加速场景中的应用
本文介绍三种配置方法:通过“A鉴权”模板创建函数并设置触发器路由;在ESA上配置回源302跟随;以及自定义响应头。每步均配有详细截图指引,帮助开发者快速完成相关功能设置,提升服务安全性与灵活性。
302 2
|
7天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
456 93