`

hibernate主键生成策略

 
阅读更多
看尚学堂Hibernate视频做的一些笔记,仅供参考。。。

Mysql的自增字段用auto_increment,Oracle的自增字段用sequence。

<generator class=”increment”></generator>在集群环境下不要使用,因为ID容易重复。Increment用的很少。

当generator是native时,表示根据数据库选择用identity(mysql下就是auto_increment),sequence(Oracle下)或者hilo。用的最多。此时Id要是int类型,Identity,sequence和uuid(要求id是String类型)用的也挺多。要想使数据库跨平台,应该用native或者uuid。

Oracle中表名不允许用_开头。

在Annotation中加ID生成器就是在@Id注解下加@GeneratedValue,默认是AUTO,相当于xml的native,对MySQL使用auto_increment,对Oracle使用HIBERNATE_SEQUENCE(名称固定,先用select hibernate_sequence.nextval from dual取出最大值),对SqlServer用identity。

@GeneratedValue还可以是INDENTITY,SEQUENCE,TABLE,如@GeneratedValue(strategy=GenerationType.IDENTITY)

要想Oracle中产生的sequence的 名字是自己定义的,可以如下:

在@Entity下加@SequenceGenerator(name=”teacherSequence”, sequenceName=”teacherSequence_DB”),name指的是这个sequence生成器的名字,sequenceName指的是在数据库中生成的sequence的名字。

然后@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=” teacherSequence”)

这样该实体类所用的sequence就是teacherSequence_DB这个sequence了。

也可以定义TableGenerator,用生成的表中的数值来生成主键,做法如下:

在@Entity下加@TableGenerator(

                name=”Teacher_GEN”,

                table=”GENERATOR_TABLE”,

                pkColumnName=”pk_key”,不能用key,因为是关键词

                valueColumnName=”pk_value”,

                pkColumnValue=”Teacher”,

                allocationSize=1

)

生成的表名为GENERATOR_TABLE,总共有两个字段,主键的字段名为key,另一个字段名为value。pkColumnValue=”Teacher”,指的是有一条记录,这条记录的key是Teacher,默认的value字段的值是1,value字段的值就是要拿到的id值。取完一个值后,这条记录的value字段的值就加上allocationSize的值,变成了2. 拿id值的sql语句相当于select value from GENERATOR_TABLE where key = ‘Teacher’;     如果这个TableGenerator为n张表提供id值,那么相应的就有n条记录,只是每条记录的key值不一样而已。

然后使用的话在@Id注解下加上@GeneratedValue(strategy=GenerationType.TABLE, generator=” Teacher_GEN”)

这种TableGenerator可以跨数据库平台,里面的数据也可以跨平台。不过实际上跨数据库平台这种需求比较少。

@Entity下可以定义多个Generator,下面要用哪个就写哪个的name值。

基于xml的联合主键:

先写一个主键类,如StudentPK,里面只有id,name两个字段。再加上get,set方法。然后再Student类中声明private StudentPK pk;                    Student和StudentPK是组合关系。

然后在Student.hbm.xml映射文件中加入:

<composite-id name=”pk” class=”com.hibernate.StudentPK”>

                <key-property name=”id” ></key-property>

                <key-property name=”name” ></key-property>

</composite-id>

StudentPK还要重写equals,hashCode方法(保证StudentPK对象都是唯一的),实现Serializable接口(因为要把StudentPK对象进行序列化(写到硬盘上,或者进行网络传输),即固化到数据库中。或者当某台服务器死机的时候可以把内存中的Student对象传输到另一台服务器中。或者当内存满了的时候,使用虚拟内存(把硬盘上的一部分空间作为内存),这样就可以把一部分Student对象序列化到硬盘上)。

重写equals方法:

@Override

public Boolean equals(Object o) {

                if (o instanceof StudentPK) {

                                StudentPK pk = (StudentPK) o;

                                If (this.id == pk.getId() &&  this.name.equals(pk.getName())) {

                                                Return true;

                                }

                }

                Return false;

}

重写hashCode方法

@Override

public int hashCode() {

                return this.name.hashCode();

}

hashTable的结构:实际上hashTable很多时候就是一个数组,数组里面有很多位置,hashCode相同的对象是放在同一个位置中的,所以同一个位置中的对象往往是以链表的形式存放的。链表里所有的对象都是hashCode相同的。当我们从hashTable中查找一个对象时,先根据该对象的hashCode找到相应的位置,再遍历这个位置中的链表中的对象,根据equals方法进行匹配。

要将一系列的Student对象装到HashTable中,需要先计算每个Student对象的hashCode,然后根据hashCode将Student对象装到HashTable中。但不会直接计算Student对象的hashCode,因为数据库的逻辑,区分不同的Student对象是根据StudentPK来决定的,所以应该计算StudentPK对象的hashCode。

基于Annotation的联合主键:

一共有三种做法:

将组件类注解为@Embeddable,并将组件的属性注解为@Id
即将TeacherPK注解为@Embedddable(可以被嵌入的),将Teacher类中的public TeacherPK getPk(){}注解为@Id,而不是将TeacherPK中的属性注解为@Id。

将组件的属性注解为@EmbeddedId
不要将TeacherPK注解为@Embedddable,直接将Teacher类中的public TeacherPK getPk(){}注解为@EmbeddedId,这种比较常用。

将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id
Teacher类中不需要TeacherPK属性,还是以前的id和name,在Teacher类前加上@IdClass(TeacherPK.class),然后在id和name的get方法前都加@Id就可以了。但是这时从数据库中读取记录的时候或者把Teacher对象存放在Map中时还是需要TeacherPK主键对象的。
分享到:
评论

相关推荐

    Hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    常用Hibernate主键生成策略

    ### 常用Hibernate主键生成策略详解 #### 一、引言 在数据库设计与操作过程中,主键是确保数据唯一性的关键要素之一。在实际应用中,开发者经常需要处理不同类型的数据库,并且需要应对各种不同的主键生成需求。...

    (179722824)三相异步电机矢量控制仿真模型

    三相异步电机矢量控制仿真模型。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    一次并发导致错误分析与总结

    一次并发导致错误分析

    025 - 快手直播词和控场话术.docx

    025 - 快手直播词和控场话术

    第4章 管理信息库2024v2.pdf

    第4章 管理信息库2024v2

    (178729196)pytorch人脸表情识别数据集(2w8训练集+7k测试集)

    在本文中,我们将深入探讨如何使用PyTorch进行人脸表情识别。这个数据集包含28,000张训练图像和7,000张测试图像,专为Python开发人员设计,以研究和构建深度学习模型来理解人类的情绪。PyTorch是一个强大的深度学习框架,因其灵活性和易用性而被广泛采用,它提供了动态计算图的功能,便于构建和调试神经网络。 让我们了解人脸表情识别的基本概念。这是一个计算机视觉任务,旨在根据面部特征识别七种基本表情:高兴、悲伤、惊讶、恐惧、愤怒、厌恶和中立。这通常涉及到图像处理、特征提取和机器学习算法。 要开始使用这个数据集,你需要做以下步骤: 1. **数据预处理**:解压Datawhale_人脸情绪识别_数据集文件,然后对图像进行预处理。这可能包括调整大小、归一化像素值到0-1区间、以及数据增强,如随机翻转、裁剪或旋转,以增加模型的泛化能力。 2. **数据加载器**:使用PyTorch的`torch.utils.data.Dataset`和`DataLoader`类来创建自定义数据加载器。这将使你能批量加载数据,并在训练过程中高效地处理图像。 3. **模型构建**:选择一个适合任务的卷

    070 - 直播核心细节话术.docx

    070 - 直播核心细节话术

    基于springboot的微服务的旅行社门店系统的设计实现源码(java毕业设计完整源码+LW).zip

    功能说明:可以管理首页、个人中心、用户管理、旅行社管理、产品分类管理、门店公告管理、行政中心管理、订单信息管理、合同信息管理、社区留言、系统管理等功能模块。环境说明:开发语言:Java框架:springboot,mybatisJDK版本:JDK1.8数据库:mysql 5.7数据库工具:Navicat11开发软件:eclipse/ideaMaven包:Maven3.6

    基于springboot的校友社交系统源码(java毕业设计完整源码+LW).zip

    系统管理员主要包括首页、个人中心、用户管理、校友信息管理、校友会信息管理、加入校友会管理、活动类型管理、校友活动管理、报名申请管理、岗位管理、招聘信息管理、项目管理、校园捐赠管理、我的捐赠管理、校友相亲管理、论坛中心、系统管理。 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

    АДЛИН - No Love(Instrumental).mp3

    АДЛИН - No Love(Instrumental).mp3

    基于java+springboot+mysql+微信小程序的社区超市管理系统 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、微信开发者工具 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat

    (177078646)python决策树实现鸢尾花分类

    这个项目是基于 Python 编写的,使用决策树算法对鸢尾花数据集进行分类。决策树是一种常用的监督学习算法,适用于分类和回归问题。在这个项目中,我们主要关注鸢尾花分类任务。 项目介绍: 数据集: 项目使用经典的鸢尾花数据集(Iris dataset)。这个数据集包含了三个不同种类的鸢尾花(山鸢尾、变色鸢尾、维吉尼亚鸢尾)的样本数据,每个样本有四个特征(花瓣长度、花瓣宽度、花萼长度、花萼宽度)。 决策树算法: 决策树是一种树形结构,其中每个节点代表一个特征,每个分支代表一个特征取值,每个叶子节点代表一个类别。通过对数据集进行递归划分,决策树学习从输入特征到输出标签的映射。 数据预处理: 在项目中,首先对鸢尾花数据集进行加载和预处理,包括数据的划分成训练集和测试集。 模型训练: 使用训练集训练决策树模型,让模型从数据中学习特征和类别之间的关系。 模型评估: 使用测试集对训练好的决策树模型进行评估,衡量模型的分类性能。通常使用准确率、精确度、召回率等指标进行评估。 结果展示: 最后,项目展示了决策树模型对新样本进行分类的能力,通过可视化方式展示决策树的结构。 这个项目旨在演。内容来源于网络分

    096 - 主播活跃直播间的台词.docx

    096 - 主播活跃直播间的台词

    全球地表覆盖图 -所有类型(无偏移).zip

    地表覆盖分布是气候变化研究、生态环境评估及地理国情监测等不可或缺的重要基础信息。近年来,随着卫星遥感和计算机存储与计算能力的不断增强,全球尺度中高分辨率地表覆盖产品的应用需求日益迫切。   作为全球首套2020年全球30米精细地表覆盖产品,该数据集及时反映了2020年全球陆地区域(除南极洲)在30米空间分辨率下的地表覆盖分布状况,为地表相关应用提供了最新的数据支撑,对于全球变化、可持续发展分析以及地理国情监测等具有重要意义。   经过多年研究,该团队突破了全球30米地表覆盖多时相自动化精细分类关键技术,并于2019年9月发布了精细分类体系的2015年全球30米地表覆盖精细分类产品。该团队在此基础上做了大量优化工作,例如结合定量遥感反演模型对分类体系做了进一步深化(林地二级类从区域尺度拓展为全球尺度),利用多源辅助数据集和专家先验知识集改善了原来存在的少量错分和漏分问题,针对原来存在的少许空间过渡不连续问题进行了针对性处理与优化。

    基于springboot的旧物置换网站源码(java毕业设计完整源码+LW).zip

    项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea

    (2368806)CCNA中文版PPT

    **CCNA(思科认证网络助理工程师)是网络技术领域中的一个基础认证,它涵盖了网络基础知识、IP编址、路由与交换技术等多个方面。以下是对CCNA中文版PPT中可能涉及的知识点的详细说明:** ### 第1章 高级IP编址 #### 1.1 IPv4地址结构 - IPv4地址由32位二进制组成,通常分为四段,每段8位,用点分十进制表示。 - 子网掩码用于定义网络部分和主机部分,如255.255.255.0。 - IP地址的分类:A类、B类、C类、D类(多播)和E类(保留)。 #### 1.2 子网划分 - 子网划分用于优化IP地址的分配,通过借用主机位创建更多的子网。 - 子网计算涉及掩码位数选择,以及如何确定可用的主机数和子网数。 - CIDR(无类别域间路由)表示法用于更有效地管理IP地址空间。 #### 1.3 私有IP地址 - 为了节省公网IP地址,私有IP地址被用于内部网络,如10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。 #### 1.4 广播地址 - 每个网络都有一个特定的广播地址,所有数据包都会发送到这个地址以达到同一网络内的所有设备。

    汽车安全技术之ESC系统介绍及其电路配置

    内容概要:本文介绍了 ESC(Electronic Stability Control)电子稳定控制系统,这是一种用于提高汽车操控稳定性的技术,主要包括 ABS(防抱死刹车系统)、TCS(牵引力控制系统)和偏航控制。ESC 通过监测车辆动态,自动调整四个车轮的刹车,防止车轮打滑和车辆侧滑。文章还详细解释了 ESC 的电路配置,包括收发器、MCU、DC/DC 转换器、马达驱动电路和阀门驱动电路等关键组件的工作原理和所需电子零部件的特点。 适合人群:汽车行业从业者、汽车电子工程师及相关领域的研究者。 使用场景及目标:帮助读者了解 ESC 系统的基本原理和技术细节,适用于汽车安全技术研发、故障排除及系统维护等工作。 其他说明:文中还提到了未来 ESC 系统的发展趋势,包括提高刹车控制精度、小型化和冗余化、低损耗与耐热性,以及智能化和网联化等方面的内容。

Global site tag (gtag.js) - Google Analytics