Hibernate详解(四)---->>关联关系映射(一)

本文介绍了Hibernate框架中两种常见的关联关系映射方式:单向多对一和单向一对多。通过具体实例展示了如何在Java实体类及XML映射文件中进行配置。

Hibernate详解(四)---->>关联关系映射(一)

      关联关系是在领域模型建模中经常使用到的一种关系,它是对现实世界中事物之间的关系最基本的表示。
     关联关系指的是不同持久化类之间的一种结构关系,简单的说,关联关系描述某个对象在一段时间内一直知道另一个对象的存在。
     关联关系包括多样性的关联和方向性的关联。
     Hibernate 框架作为一种 ORM 技术的实现,对关联关系的映射实现得很完美,也易于理解和掌握,接下来分别介绍各类型关联关系的映射在 Hibernate 中是如何实现的。   
 

 

 

1、单向多对一

    多对一是最常见的,也是最容易理解的一种关联。比如:多个员工属性同一个部门。多个产品属于同一个类别,多个产品订单属于同一个账号。单向的多对一指的是多方可以访问一方,而一方不知道多方的存在。

 


Department.java(一方)

 

package com.zxf.domain;


/** 部门实体类 */
public class Department {
	private Long id;                //对象标识符(OID)
	private String name;            //姓名
	private String description;     //入职时间
	
	public Department(){}              //无参数的构造方法

	//以下省略所有属性的getters和setters方法...
}

 

 Employee.java(多方)

 

package com.qiujy.domain;

import java.util.Date;

/** 员工实体类 */
public class Employee {
	private Long id;                //对象标识符(OID)
	private String username;        //姓名
	private Date joinTime;          //入职时间
	
	private Department dept;        //所属的部门

	public Employee(){}             //无参数的构造方法

	//以下省略所有属性的getters和setters方法...
}

 

 Department.hbm.xml

 

<?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="com.zxf.domain.Department" table="department">
		<!-- 映射对象标识符 -->
		<id name="id" column="id" type="long">
			<generator class="native" />
		</id>
		<!-- 映射普通属性 -->
		<property name="name"/>
		<property name="description"/>
	</class>
</hibernate-mapping>

 

Employee.hbm.xml

 

<?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="com.zxf.domain.Employee" 
	       table="employee">
		<!-- 映射对象标识符 -->
		<id name="id" column="id" type="long">
			<generator class="native" />
		</id>
		<!-- 映射普通属性 -->
		<property name="username" not-null="true" />
		<property name="joinTime" 
		          column="join_time" type="timestamp"/>
		
		<!-- 用many-to-one元素映射多对一关联
		     name属性:指定关联的属性名
		     column属性:指定此关联属性在数据库表中的外键字段名
		 -->
		<many-to-one name="dept" column="dept_id"/>
	</class>
</hibernate-mapping>

 

配置文件:hibernate.cfg.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		
		<!-- 数据库方言设置 -->
		<property name="hibernate.dialect">
			org.hibernate.dialect.MySQLInnoDBDialect
		</property>
		
		<!-- 数据库连接参数设置 -->
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property 

name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123</property>
	
		<!--实际操作数据库时是否显示SQL -->
		<!-- 
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		-->
		
		<!--将数据库schema的DDL导出到数据库 -->
		<property name="hibernate.hbm2ddl.auto">update</property>

		<!-- 以下定义实体类与数据库表的映像文件 -->
		<mapping resource="com/zxf/domain/Department.hbm.xml" />
		<mapping resource="com/zxf/domain/Employee.hbm.xml" />
	</session-factory>
</hibernate-configuration>

 

 

2、单向一对多


     举个示例来映射单向一对多关联关系。如:一个账号可以下多个订单。

 

Order.java(多方   配置文件比较简单)

 

package com.zxf.domain;

import java.util.Date;

/** 订单实体类 */
public class Order {
	private Long id;                //对象标识符(OID)
	private String orderNo;         //订单编号
	private Date createdTime;       //下单时间

	public Order(){}             //无参数的构造方法

	//以下省略所有属性的getters和setters方法...
}

 

Account.java(一方    配置文件相对复杂)

 

package com.zxf.domain;

import java.util.Set;


/** 账号实体类 */
public class Account {
	private Long id;                //对象标识符(OID)
	private String loginName;       //姓名
	private Set<Order> orderSet;    //所下订单的集合
	
	public Account(){}              //无参数的构造方法

	//以下省略所有属性的getters和setters方法...
}

 

Order.hbm.xml

 

<?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="com.zxf.domain.Order" 
	       table="orders">
		<!-- 映射对象标识符 -->
		<id name="id" column="id" type="long">
			<generator class="native" />
		</id>
		<!-- 映射普通属性 -->
		<property name="orderNo" column="order_no"/>
		<property name="createdTime" 
		          column="created_time" type="timestamp"/>
	</class>
</hibernate-mapping>
 

Account.hbm.xml

 

<?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="com.zxf.domain.Account" table="account">
		<!-- 映射对象标识符 -->
		<id name="id" column="id" type="long">
			<generator class="native" />
		</id>
		<!-- 映射普通属性 -->
		<property name="loginName" column="login_name"/>
		<!-- 映射集合属性,关联到多端的实体类 -->
		<set name="orderSet" cascade="save-update">
				<!-- 用key元素指定关联的外键列 -->
	        <key column="account_id" />
	        <!-- 用one-to-many元素关联到多端的实体类 -->
	        <one-to-many class="com.zxf.domain.Order" />
	    </set>
	</class>
</hibernate-mapping>
 


配置文件:hibernate.cfg.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		
		<!-- 数据库方言设置 -->
		<property name="hibernate.dialect">
			org.hibernate.dialect.MySQLInnoDBDialect
		</property>
		
		<!-- 数据库连接参数设置 -->
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property 

name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123</property>
	
		<!--实际操作数据库时是否显示SQL -->
		<!-- 
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		-->
		
		<!--将数据库schema的DDL导出到数据库 -->
		<property name="hibernate.hbm2ddl.auto">update</property>

		<!-- 以下定义实体类与数据库表的映像文件 -->
		<mapping resource="com/zxf/domain/Account.hbm.xml" />
		<mapping resource="com/zxf/domain/Order.hbm.xml" />
	</session-factory>
</hibernate-configuration>
 
【事件触发致性】研究多智能体网络如何通过分布式事件驱动控制实现有限时间内的共识(Matlab代码实现)内容概要:本文围绕多智能体网络中的事件触发致性问题,研究如何通过分布式事件驱动控制实现有限时间内的共识,并提供了相应的Matlab代码实现方案。文中探讨了事件触发机制在降低通信负担、提升系统效率方面的优势,重点分析了多智能体系统在有限时间收敛的致性控制策略,涉及系统模型构建、触发条件设计、稳定性与收敛性分析等核心技术环节。此外,文档还展示了该技术在航空航天、电力系统、机器人协同、无人机编队等多个前沿领域的潜在应用,体现了其跨学科的研究价值和工程实用性。; 适合人群:具备定控制理论基础和Matlab编程能力的研究生、科研人员及从事自动化、智能系统、多智能体协同控制等相关领域的工程技术人员。; 使用场景及目标:①用于理解和实现多智能体系统在有限时间内达成致的分布式控制方法;②为事件触发控制、分布式优化、协同控制等课题提供算法设计与仿真验证的技术参考;③支撑科研项目开发、学术论文复现及工程原型系统搭建; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注事件触发条件的设计逻辑与系统收敛性证明之间的关系,同时可延伸至其他应用场景进行二次开发与性能优化。
旋翼无人机】具备螺旋桨倾斜机构的全驱动旋翼无人机:建模与控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动旋翼无人机展开,重点研究其动力学建模与控制系统设计。通过Matlab代码与Simulink仿真实现,详细阐述了该类无人机的运动学与动力学模型构建过程,分析了螺旋桨倾斜机构如何提升无人机的全向机动能力与姿态控制性能,并设计相应的控制策略以实现稳定飞行与精确轨迹跟踪。文中涵盖了从系统建模、控制器设计到仿真验证的完整流程,突出了全驱动结构相较于传统旋翼在欠驱动问题上的优势。; 适合人群:具备定控制理论基础和Matlab/Simulink使用经验的自动化、航空航天及相关专业的研究生、科研人员或无人机开发工程师。; 使用场景及目标:①学习全驱动旋翼无人机的动力学建模方法;②掌握基于Matlab/Simulink的无人机控制系统设计与仿真技术;③深入理解螺旋桨倾斜机构对飞行性能的影响及其控制实现;④为相关课题研究或工程开发提供可复现的技术参考与代码支持。; 阅读建议:建议读者结合提供的Matlab代码与Simulink模型,逐步跟进文档中的建模与控制设计步骤,动手实践仿真过程,以加深对全驱动无人机控制原理的理解,并可根据实际需求对模型与控制器进行修改与优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值