Hibernate详解(四)---->>关联关系映射(二)
3、单向一对一
每个中国公民都有一张身份证,这就是典型的一对一关联关系。首先,讨论单向的一对一,即只考虑从公民这一端能找到它的身份证,而身份证这一端不知道公民的存在。
有两种常用的方式可以表示这种一对一关系:基于唯一外键关联方式和基于主键关联方式。
方式一:基于外键关联方式
Citizen.java
package com.zxf.domain;
/** 公民实体类 */
public class Citizen {
private Long id; //对象标识符(OID)
private String name; //姓名
private boolean gender; //性别
private IDCard idCard; //身份证
public Citizen(){} //无参数的构造方法
//以下省略所有属性的getters和setters方法...
}
IDCard.java
package com.zxf.domain;
/** 身份证实体类 */
public class IDCard {
private Long id; //对象标识符(OID)
private String no; //身份证编写
public IDCard(){} //无参数的构造方法
//以下为所有属性的getters和setters方法...
}
Citizen.hbm.xml
<hibernate-mapping>
<!-- 映射持久化类 -->
<class name="com.zxf.domain.Citizen" table="citizen">
<!-- 映射对象标识符 -->
<id name="id" column="id" type="long">
<generator class="native" />
</id>
<!-- 映射普通属性 -->
<property name="name"/>
<property name="gender"/>
<!-- 用many-to-one元素映射基于唯一外键的一对一关联
name属性:指定关联的属性名
column属性:指定此关联属性在数据库表中的外键字段名
unique属性:指定值为“true”来限制多端的多重性为一
cascade属性:用来指定两个对象之间的操作联动关系
-->
<many-to-one name="idCard"
column="idcard_id"
unique="true"
cascade="all"/>
</class>
</hibernate-mapping>
IDCard.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.IDCard"
table="idcard">
<!-- 映射对象标识符 -->
<id name="id" column="id" type="long">
<generator class="native" />
</id>
<!-- 映射普通属性 -->
<property name="no" not-null="true" />
</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/Citizen.hbm.xml" />
<mapping resource="com/zxf/domain/IDCard.hbm.xml" />
</session-factory>
</hibernate-configuration>
方式二:基于主键关联方式
citizen表和idcard表具有相同的主键。这种实现方式的映射文件如下。
Citizen.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.Citizen" table="citizen">
<!-- 映射对象标识符 -->
<id name="id" column="id">
<!-- foreign表示使用另外一个相关联的对象(用property属性指定
的那个属性)的标识符 -->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<!-- 映射普通属性 -->
<property name="name"/>
<property name="gender"/>
<!-- 用one-to-one元素映射基于主键的一对一关联
name属性:指定关联的属性名
constrained属性:true表示该类对应的数据库表和被关联的对象所对应
的数据库表之间,通过一个外键引用对主键进行约束。
-->
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
备注:
在这个映射文件中,通过指定标识符生成器为foreign来保证与property属性指定的对象共享同一个OID。使用one-to-one 元素来映射一对一关联。通过constrained=true ,添加了把citizen表的主键链接到idcard表主键的外键约束,即数据库保证citizen表的主键引用有效的idcard表的主键。
4、双向一对一
单向的一对一关联常用的实现方式有两种:基于唯一外键和基于主键。同样,双向的一对一关联也有这两种常用的实现方式。
方式一:基于外键一对一关联方式
Citizen.java
package com.zxf.domain;
/** 公民实体类 */
public class Citizen {
private Long id; //对象标识符(OID)
private String name; //姓名
private boolean gender; //性别
private IDCard idCard; //身份证
public Citizen(){} //无参数的构造方法
//以下为所有属性的getters和setters方法...
}
IDCard.java
package com.zxf.domain;
/** 身份证实体类 */
public class IDCard {
private Long id; //对象标识符(OID)
private String no; //身份证编写
private Citizen citizen; //所属公民
public IDCard(){} //无参数的构造方法
//以下为所有属性的getters和setters方法...
}
Citizen.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.Citizen" table="citizen">
<!-- 映射对象标识符 -->
<id name="id" column="id" type="long">
<generator class="native" />
</id>
<!-- 映射普通属性 -->
<property name="name"/>
<property name="gender"/>
<!-- 用many-to-one元素映射基于唯一外键的一对一关联
name属性:指定关联的属性名
column属性:指定此关联属性在数据库表中的外键字段名
unique属性:指定值为“true”来限制多端的多重性为一
cascade属性:用来指定两个对象之间的操作联动关系
-->
<many-to-one name="idCard"
column="idcard_id"
unique="true"
cascade="all"/>
</class>
</hibernate-mapping>
IDCard.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.IDCard"
table="idcard">
<!-- 映射对象标识符 -->
<id name="id" column="id" type="long">
<generator class="native" />
</id>
<!-- 映射普通属性 -->
<property name="no" not-null="true" />
<!-- one-to-one映射一对一关联
property-ref属性:指定反向属性引用 -->
<one-to-one name="citizen" property-ref="idCard" />
</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/Citizen.hbm.xml" />
<mapping resource="com/zxf/domain/IDCard.hbm.xml" />
</session-factory>
</hibernate-configuration>
方式二:基于主键的双向一对一关联方式
基于主键的映射方式,指的是一端的主键使用foreign策略来参照另一端的主键来生成,这样两端就具有相同的主键值。当然,关联的任何一端都可以采用foreign策略来生成主键,只是在采用foreign策略生成主键的一端要使用one-to-one 元素映射关联的对象,同时还要添加constrainted=true 属性。而没有使用foreign策略生成主键的那一端就可能直接使用one-to-one 元素来映射关联的对象。具体的映射文件如下:
Citizen.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.Citizen" table="citizen">
<!-- 映射对象标识符 -->
<id name="id" column="id">
<!-- foreign表示使用另外一个相关联的对象(用property属性指定
的那个属性)的标识符 -->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<!-- 映射普通属性 -->
<property name="name"/>
<property name="gender"/>
<!-- 用one-to-one元素映射基于主键的一对一关联
name属性:指定关联的属性名
constrained属性:true表示该类对应的数据库表和被关联的对象所对应
的数据库表之间,通过一个外键引用对主键进行约束。
-->
<one-to-one name="idCard" constrained="true" cascade="all"/>
</class>
</hibernate-mapping>
IDCard.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.IDCard"
table="idcard">
<!-- 映射对象标识符 -->
<id name="id" column="id" type="long">
<generator class="native" />
</id>
<!-- 映射普通属性 -->
<property name="no" not-null="true" />
<!-- one-to-one映射一对一关联 -->
<one-to-one name="citizen"/>
</class>
</hibernate-mapping>
分享到:
相关推荐
内容概要:本文详细介绍了基于MATLAB GUI界面和卷积神经网络(CNN)的模糊车牌识别系统。该系统旨在解决现实中车牌因模糊不清导致识别困难的问题。文中阐述了整个流程的关键步骤,包括图像的模糊还原、灰度化、阈值化、边缘检测、孔洞填充、形态学操作、滤波操作、车牌定位、字符分割以及最终的字符识别。通过使用维纳滤波或最小二乘法约束滤波进行模糊还原,再利用CNN的强大特征提取能力完成字符分类。此外,还特别强调了MATLAB GUI界面的设计,使得用户能直观便捷地操作整个系统。 适合人群:对图像处理和深度学习感兴趣的科研人员、高校学生及从事相关领域的工程师。 使用场景及目标:适用于交通管理、智能停车场等领域,用于提升车牌识别的准确性和效率,特别是在面对模糊车牌时的表现。 其他说明:文中提供了部分关键代码片段作为参考,并对实验结果进行了详细的分析,展示了系统在不同环境下的表现情况及其潜在的应用前景。
嵌入式八股文面试题库资料知识宝典-计算机专业试题.zip
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_3.zip
内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。
少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
内容概要:本文详细介绍了基于PID控制器的四象限直流电机速度驱动控制系统仿真模型及其永磁直流电机(PMDC)转速控制模型。首先阐述了PID控制器的工作原理,即通过对系统误差的比例、积分和微分运算来调整电机的驱动信号,从而实现转速的精确控制。接着讨论了如何利用PID控制器使有刷PMDC电机在四个象限中精确跟踪参考速度,并展示了仿真模型在应对快速负载扰动时的有效性和稳定性。最后,提供了Simulink仿真模型和详细的Word模型说明文档,帮助读者理解和调整PID控制器参数,以达到最佳控制效果。 适合人群:从事电力电子与电机控制领域的研究人员和技术人员,尤其是对四象限直流电机速度驱动控制系统感兴趣的读者。 使用场景及目标:适用于需要深入了解和掌握四象限直流电机速度驱动控制系统设计与实现的研究人员和技术人员。目标是在实际项目中能够运用PID控制器实现电机转速的精确控制,并提高系统的稳定性和抗干扰能力。 其他说明:文中引用了多篇相关领域的权威文献,确保了理论依据的可靠性和实用性。此外,提供的Simulink模型和Word文档有助于读者更好地理解和实践所介绍的内容。
嵌入式八股文面试题库资料知识宝典-2013年海康威视校园招聘嵌入式开发笔试题.zip
少儿编程scratch项目源代码文件案例素材-驾驶通关.zip
小区开放对周边道路通行能力影响的研究.pdf
内容概要:本文探讨了冷链物流车辆路径优化问题,特别是如何通过NSGA-2遗传算法和软硬时间窗策略来实现高效、环保和高客户满意度的路径规划。文中介绍了冷链物流的特点及其重要性,提出了软时间窗概念,允许一定的配送时间弹性,同时考虑碳排放成本,以达到绿色物流的目的。此外,还讨论了如何将客户满意度作为路径优化的重要评价标准之一。最后,通过一段简化的Python代码展示了遗传算法的应用。 适合人群:从事物流管理、冷链物流运营的专业人士,以及对遗传算法和路径优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于冷链物流企业,旨在优化配送路线,降低运营成本,减少碳排放,提升客户满意度。目标是帮助企业实现绿色、高效的物流配送系统。 其他说明:文中提供的代码仅为示意,实际应用需根据具体情况调整参数设置和模型构建。
少儿编程scratch项目源代码文件案例素材-恐怖矿井.zip
内容概要:本文详细介绍了基于STM32F030的无刷电机控制方案,重点在于高压FOC(磁场定向控制)技术和滑膜无感FOC的应用。该方案实现了过载、过欠压、堵转等多种保护机制,并提供了完整的源码、原理图和PCB设计。文中展示了关键代码片段,如滑膜观测器和电流环处理,以及保护机制的具体实现方法。此外,还提到了方案的移植要点和实际测试效果,确保系统的稳定性和高效性。 适合人群:嵌入式系统开发者、电机控制系统工程师、硬件工程师。 使用场景及目标:适用于需要高性能无刷电机控制的应用场景,如工业自动化设备、无人机、电动工具等。目标是提供一种成熟的、经过验证的无刷电机控制方案,帮助开发者快速实现并优化电机控制性能。 其他说明:提供的资料包括详细的原理图、PCB设计文件、源码及测试视频,方便开发者进行学习和应用。
基于有限体积法Godunov格式的管道泄漏检测模型研究.pdf
嵌入式八股文面试题库资料知识宝典-CC++笔试题-深圳有为(2019.2.28)1.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 V1.5.zip
Android系统开发_Linux内核配置_USB-HID设备模拟_通过root权限将Android设备转换为全功能USB键盘的项目实现_该项目需要内核支持configFS文件系统
C# WPF - LiveCharts Project
少儿编程scratch项目源代码文件案例素材-恐怖叉子 动画.zip
嵌入式八股文面试题库资料知识宝典-嵌⼊式⼯程师⾯试⾼频问题.zip