Hibernate第三篇【主配置文件、映射文件、复合主键映射】

前言

目前已经学了如何搭建Hibernate的开发环境,以及Hibernate对应的API了…在快速入门还没讲解的就是配置文件是怎么配置的。因此,本博文主要讲解主配置文件以及映射配置文件..

主配置文件

主配置文件主要配置:

  • 数据库的信息
  • 其他参数
  • 加载映射文件

常用的配置信息都可以在hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties目录下可以找到..

数据库信息

常用的配置信息都可以在hibernate.properties文件中找到,因此,我们来搜索一下:

这里写图片描述


        <!-- 1. 数据库连接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!-- 
            数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql【大致可以理解成:不同的版本对应的SQL不同】
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

其他参数信息

常用的有那么三个:


        <!-- 2. 其他相关配置 -->
        <!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 2.2 格式化sql -->
        <property name="hibernate.format_sql">true</property>
        <!-- 2.3 自动建表  -->
        <property name="hibernate.hbm2ddl.auto">update</property>

需要我们注意的是自动建表,其中它有几个参数:

这里写图片描述

  • create-drop 每次在创建sessionFactory时候执行创建表。当调用sesisonFactory的close方法的时候,删除表!
  • create 每次都重新建表; 如果表已经存在就先删除再创建
  • update 如果表不存在就创建; 表存在就不创建;
  • validate (生成环境时候) 执行验证: 当映射文件的内容与数据库表结构不一样的时候就报错!

加载映射文件

值得注意的是:mapping的属性使用的是resource!


        <!--3. 加载映射文件-->
        <mapping resource="zhongfucheng/domain/User.hbm.xml"/>

加载映射文件其实我们可以在程序中加载,不一定在配置文件中配置….一般地,我们在测试的时候一般使用程序的方式去加载映射文件【方便】

那么怎么在程序中加载映射文件呢?

在Configuration对象中提供了addClass()的方法。

一般地我们的映射配置文件和JavaBean对象是放在同一个包下的。并且映射文件的命名是有规范的。因此Hibernate是可以通过提供的JavaBean对象从而找到相对应的映射文件!

        //获取加载配置管理类
        Configuration configuration = new Configuration();

        //加载User的映射文件!
        configuration.configure().addClass(User.class);

映射配置文件

映射文件: 映射一个实体类对象; 描述一个对象最终实现可以直接保存对象数据到数据库中

通常地,我们都是一个JavaBean对象对应一个映射配置文件,并且配置文件和JavaBean对象是放在同一个目录下的

我们按照快速入门的映射配置文件一步一步来讲解:


<!--在domain包下-->
<hibernate-mapping package="zhongfucheng.domain">

    <!--类名为User,表名也为User-->
    <class name="User"  table="user">

        <!--主键映射,属性名为id,列名也为id-->
        <id name="id" column="id">
            <!--根据底层数据库主键自动增长-->
            <generator class="native"/>

        </id>

        <!--非主键映射,属性和列名一一对应-->
        <property name="username" column="username"/>
        <property name="cellphone" column="cellphone"/>
        <property name="password" column="password"/>
    </class>
</hibernate-mapping>

<hibernate-mapping>节点

常用的属性:

  • package【要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)】
  • auto-import
    • 默认为true, 在写hql的时候自动导入包名
    • 如果指定为false, 再写hql的时候必须要写上类的全名;

<class>节点

class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)

常用的属性:

  • name【指定要映射的对象的类型】
  • table【指定对象对应的表】
    • 如果没有指定,默认与对象名称一样

<property>节点

property是普通属性的映射,即JavaBean普通的成员变量属性就使用property来描述!

常用的属性:

  • name 指定对象的属性名称
  • column 指定对象属性对应的表的字段名称
    • 如果不写默认与对象属性一致。
  • length 指定字符的长度, 默认为255
  • type 指定映射表的字段的类型,如果不指定会匹配属性的类型
    • java类型: 必须写全名【例:java.lang.String】
      -* hibernate类型: 直接写类型,都是小写*

值得注意的是:如果列名称为数据库关键字,需要用反引号或改列名。当然啦,我们一般不使用关键字来作为列名

7———-

<id>节点

id是主键映射….

  • name 指定对象的属性名
  • column 指定对象属性对应的表的字段名称

<id>节点下还有子节点<generator class=""/>

主键的自动生成策略

  • identity 自增长(mysql,db2)
  • sequence 自增长(序列), oracle中自增长是以序列方法实现**
  • **native 自增长【会根据底层数据库自增长的方式选择identity或sequence】
    • 如果是mysql数据库, 采用的自增长方式是identity
    • 如果是oracle数据库, 使用sequence序列的方式实现自增长
  • increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)

指定主键生成策略为手动指定主键的值

  • assigned

指定主键生成策略为UUID生成的值

  • uuid

foreign(外键的方式, one-to-one讲)


<composite-id>

主键一般分为两种:

  • 单列主键
  • 多列复合主键

单列主键就是上面那种,那么如果要使用多列复合主键就需要使用<composite-id>节点来配置了

  • 现在我有这么下面的一个对象,我想使用username和password作为复合主键
public class User2 {

    private String username;
    private String password;
    private String cellphone;

    //各种setter和getter方法 
}
  • 将username和password抽取成一个类—->CompositeKey….必须实现Serializable接口

package zhongfucheng.domain;

/**
 * Created by ozc on 2017/5/6.
 */
public class CompositeKey  implements Serializable{

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
  • 在User2中需要指定一个变量来维护这个主键对象

package zhongfucheng.domain;

/**
 * Created by ozc on 2017/5/6.
 */
public class User2 {

    //在User对象中维护这个主键对象
    private CompositeKey key;
    private String cellphone;

    public CompositeKey getKey() {
        return key;
    }

    public void setKey(CompositeKey key) {
        this.key = key;
    }

    public String getCellphone() {
        return cellphone;
    }

    public void setCellphone(String cellphone) {
        this.cellphone = cellphone;
    }
}

测试


    public static void main(String[] args) {

        //创建对象
        User2 user2 = new User2();
        CompositeKey compositeKey = new CompositeKey();
        compositeKey.setUsername("123");
        compositeKey.setPassword("123");
        user2.setCellphone("111");
        user2.setKey(compositeKey);

        //获取加载配置管理类
        Configuration configuration = new Configuration();

        //加载User的映射文件!
        configuration.configure().addClass(User2.class);

        //创建Session工厂对象
        SessionFactory factory = configuration.buildSessionFactory();

        //得到Session对象
        Session session = factory.openSession();

        //使用Hibernate操作数据库,都要开启事务,得到事务对象
        Transaction transaction = session.getTransaction();

        //开启事务
        transaction.begin();

        //添加User2对象到数据库
        session.save(user2);


        //提交事务
        transaction.commit();

        //关闭Session
        session.close();
    }

这里写图片描述

因为Hibernate在取得的时候是需要实现Serializable这个接口的对象的…因此compositeKey必须实现Serializable接口

这里写图片描述

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
8.Python基础语法(五)续【光说不练假把式,上题】 Python基础语法(二) 有关于Python循环语句的几道实操,让大家理解知识点更深更透彻~ 阅读详情

相关推荐

BERT + BiLSTM-CRF 处理流程

BERT是一个基于 Transformer 的预训练语言模型。与传统的语言模型不同,BERT 是双向的,即它同时利用上下文信息进行词表示学习。BERT 在大规模语料库上进行预训练,可以捕捉到深层次的语言知识和上下文关系,生成非常丰富的词向量表示。在序列标注任务中,BERT 被用作输入文本的编码器,将每个词映射为上下文相关的词嵌入(embeddings)。

AI Agent 首席体验官 2258

Evidently时间序列分析:时序数据漂移检测与预测监控

在机器学习模型的部署过程中,时间序列数据(Time Series Data)的监控尤为关键。不同于传统的静态数据,时间序列数据具有时间依赖性、趋势性和季节性等特征,这使得数据漂移(Data Drift)和模型性能退化的问题更加复杂和隐蔽。 你是否遇到过这样的场景: - 预测模型在测试阶段表现优异,但在生产环境中性能逐渐下降 - 季节性业务数据出现异常波动,但难以快速定位问题根源 - 多变量时间序...

gitblog_00475的博客 1046

浅谈专项测试之弱网络测试

浅谈专项测试之弱网络测试 一.弱网络测试背景 移动端产品的使用并非完全都是在流畅的wifi环境,大部分用户主要使用4G,3G,2G等网络,另外因为移动端产品使用的场景多变,如进公交,上地铁,坐电梯,使得弱网测试显得尤为重要。考虑到各种场景的客户端展示及容错,提升产品的印象和用户体验,提高产品的健壮性,弱网测试必不可少。 二.弱网络测试建议 网下需要进行功能点测试,无网络测试,网络切换测试等,测试过程除了关注功能点的实现,还应关注用户体验等各个方面 三.弱网络测试通用功能点总结 四.弱网络测试用例实例

ITstudy001的博客 1011

一文介绍数据和模型漂移(Drift):漂移检测示例

大家好,漂移(Drift)是机器学习中用来描述模型在生产环境中随着时间推移而性能逐步下降的现象,由很多原因引起,主要原因是随着时间推移输入数据(x)分布的变化和期望目标(y)之间的关系发生了变化。在使用机器学习模型时,漂移是一个很大的挑战,因为数据通常是动态的,不断变化的。机器学习模型是基于过去的数据进行学习的,但在实际使用时,由于环境的变化,这些模型可能会渐渐失去准确性,就像是“过气”一样,这种现象被称为“漂移”。数据漂移可以被看作是导致模型漂移的原因之一,而模型漂移则是由数据漂移的影响而产生的结果。

csdn1561168266的博客 7528

三维模型转变为点云模型的好工具——CloudCompare使用小记

普通三维模型能够直观地展示物体的三维全貌,但是在一些场合需要将三维模型变为相应的点云模型进行展示,而使用激光雷达等传感器采集到的点云信息往往只能反应模型表面的情况,或是使用PCL库中的可执行文件进行转换,这两种操作较为麻烦。笔者最近就遇到了这样一个情况,找到了一个名叫CloudCompare(CC)的软件,能够支持将多种文件格式的三维模型转变为点云模型。以下将本人在使用过程中所使用到的一些操作简记下来供朋友们和将来的自己参考。 一、下载 CloudCompare是一款免费软件,其可以在CloudComp

hdlwyt的博客 2万+

光模块MCU开发全解析:从架构原理到固件调试实战

在高速光模块中,MCU并非传统印象里的核心处理器,而是负责数字诊断、闭环控制和协议管理的嵌入式管家。随着800G、1.6T模块的普及,MCU与DSP/SoC的协同、I2C总线通信、ADC采集、APC/TEC控制等低速域任务愈发关键。理解MCU的选型规格、启动流程和固件设计,是保障光模块稳定运行的基础。本文从光模块架构切入,剖析MCU的角色定位,详细拆解I2C从机实现、电芯片配置、校准与升级等工程细节,并结合实际调试经验梳理常见故障与排查思路,为嵌入式工程师提供一份可落地的光模块MCU开发指南。

weixin_29192365的博客 366

Hibernate 配置文件详解

Hibernate 配置文件详解

蔡林浩的博客 2644

用Python+PyTorch实现DQN无人机避障:从环境搭建到实战训练(附完整代码)

本文详细介绍了如何使用Python和PyTorch框架,基于深度强化学习中的DQN算法,实现一个无人机自主避障系统。内容涵盖从自定义环境搭建、DQN智能体核心算法实现,到完整的训练流程与超参数调优,并提供了可视化演示与进阶优化方向,为开发者提供了从理论到实践的完整指南。

kubernetes8ctl的博客 641

HIBERINATE主键 自动生成策略

1、assigned         主键由外部程序负责生成,在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己

三月的风沙 1193

YOLOv11改进有效涨点专栏目录 | 含卷积、主干、注意力机制、Neck、检测头、损失函数、二次创新C2PSA/C3k2等各种网络结构改进

Hello,各位读者们好.本文为最新YOLOv11有效涨点专栏目录,YOLOv11以及发布了一个月左右,这个过程中我也是给大家整理了许多的机制,其中包含了C3k2、主干(均支持根据yolov11训练的版本进行二次缩放,全系列都能轻量化)、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。

Snu77的博客 8万+

OpenCASCADE完整教程专栏完整目录

OpenCASCADE完整教程专栏完整目录

希望我的博客,能帮上你解决学习中工作中所遇到的问题 9707

【Hibernate步步为营】--复合主键映射详解

复合主键的使用其实很简单,但是需要注意对象需要被拆分,主键自己需要一个类并且该类需要实现java.io.Serializable接口,其它的属性再重新生成新类,并且类的属性中要有主键类的对象,相应的只需要一个配置文件,在映射文件中使用<composite-id>指明主键,并指明主键的属性。

航帆远洋 5182

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Hibernate 映射配置,主键自增长,复合主键

1. 普通字段类型 2. 主键映射 单列主键映射 多列作为主键映射   主键生成策略,查看api:   5.1.2.2.1. Various additional generators     数据库: 一个表能否有多个主键?   不能。 为什么要设置主键?       数据库存储的数据都是有效的,必须保持唯一。   (为什么把id作为主键?) 因为表中通常找不到合适的列

sinat_35821285的博客 3846

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Hibernate学习笔记(四):复合主键映射

实体类 User.java: package com.hibernate.compositekeys; /** * 实体类 * 因为主键必须唯一,所以如果找不到合适的列作为主键,除了用 id 列以外,还可以用复合主键, * 即多列的值作为一个主键,确保唯一; */ public class User { private CompositeKeys keys; // 复合主键对...

秋忆夏伤的博客 629

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Hibernate实现复合主键的使用

复合主键的使用 1>:首先将要作为主键的属性首先抽取成单独的实体 并提供get And set方法 并且还需要序列化 2>:在实际的实体中申明主键实体的变量 3>:在映射文件中编写实体的配置文件

GuominJin的博客 4730

【hibernate】--- 复合主键映射和Component映射

在做项目中,比如我以前在基础系统写过接口,经常会遇到这么一种情况:需要该表的2-3个字段才可以唯一确定这个表的一行记录。这种情况我们用原生sql语句很快就能解决,但是如果我们用hibernate来写数据持久层的代码,hibernate是如何应对这种情况的呢?视频中的老师回答了我的这个问题:用复合主键映射来解决。 复合主键映射: 复合主键用来描述 通常做法是将主键相

My Devil's Cry 1234

hibernate中复合主键

复合主键:一张表的多个字段组合构成这张表的主键,这个主键就叫复合主键。 在hibernate中配置复合主键: Hibernate复合主键的编写有两种情况: 1、将复合主键各字段定义为私有属性。 2、将复合主键字段抽取出来定义一个主键类(暂且这样称呼),在实体类中包含主键类即可。(推荐使用这种方法) 映射文件的编写: 复合主键使用: 方式一: 由几个字段构成添加几个

Imust_can的专栏 2366

4.Hibernate的映射配置

1.映射文件的加载 在主配置文件配置 <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/> 在类中加载(测试用) private static SessionFactory sf; static { // 创建sf对象 sf = new Configuration() .configure() .addClass(Em...

yun1996的博客 305

Hibernate中复合主键的配置和使用

有关Hibernate的联合主键 对于新系统的设计开发而言,我们应尽量避免在库表中引入与业务逻辑相关的主键关系。 将业务逻辑主键引入库表,以后业务逻辑的变化,将很可能对底层数据库结构产生连带影响。 复合主键的引入,很大程度上意味着业务逻辑已经侵入到数据存储逻辑之中。 因此,应尽量避免。但实际情况中,我们必须面对遗留系统的旧表开发,这时,对现有复合主键的支持就非常必要。 hiberna

haikuotiankong1997的专栏 1万+

hibernate学习(二)主配置文件/映射配置/主键映射

Hibernate.cfg.xml 主配置   Hibernate.cfg.xml 主配置文件中主要配置:数据库连接信息、其他参数、映射信息! <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hi

大梦想家 1063

Hibernate复合主键映射

Hibernate复合主键映射 目录: 1. 实现方式一:将复合主键对应的属性与实体其他普通属性放在一起 2. 实现方式二:将主键属性提取到一个主键类中,实体类只需包含主键类的一个引用   在日常开发中会遇到这样一种情况,数据库中的某张表需要多个字段列才能唯一确定一行记录,这时表需要使用复合主键。面对这样的情况Hibernate为我们提供了两种方式来解决复合主键问题。 ...

alva88888888的博客 250

Hibernate框架 主配置文件 Hibernate.cfg.xml 映射配置 说明

1 主配置文件 Hibernate.cfg.xml 主配置文件中主要配置:数据库连接信息、其他参数、映射信息! 常用配置查看源码: hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties <!DOCTYPE hibernate-configuration PUBLIC ...

YiGE_snail的专栏 176

hibernate复合主键及关联的实现

键字: 复合主键 关联如果你不得不面对遗留系统老式的数据库复合主键,无法享受逻辑主键(代理主键)带来的幸福生活,那么使用CompositeUserType来处理复合主键是个不错的选择.废话少说,看看如何实现:Java代码 /**   * $Revision: 1.0 $   * Created: 2008-1-11   * $Date: 2008-1

edisondu1983的专栏 1357
上一篇: Hibernate第二篇【API讲解、执行流程图】
下一篇: Caused by: java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual tha
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值