这篇文章主要介绍了Hibernate映射之基本类映射和对象关系映射详解,非常具有实用价值,需要的朋友可以参考下
回想一些我们在没有学习ssh的时候,我们建立数据库的表时,首先是数据库建模E-R图,然后再通过实体模型来建立关系模型,再建立相应的表。实体间存在三种关系,一对一,一对多(或者说多对一),多对多。而如今我们要根据类来映射相应的表,那只能是通过类与类之间的关系加上映射文件来映射数据库的表。我们学习UML建模,类与类之间存在五种关系,继承,实现,关联,依赖,聚合/组合,在hibernate中实体类之间的关系也是如此,对于不同的关系对应的代码实现我们已经很熟悉了,所以对于实体类是复习的知识。
Hibernate的本质就是对象关系映射(ObjectRelational Mapping),ORM实现了将对象数据保存到数据库中,以前我们对关系表进行操作,执行增删改查等任务,现在我们不再对关系表进行操作,而是直接对对象操作。hibernate中的ORM映射文件通常以.hbm.xml作为后缀。使用这个映射文件不仅易读,而且可以手工修改,也可以通过一些工具来生成映射文档。下面将对hibernate中的映射进行介绍。
Hibernate映射分类,如下图所示。
1 基本类映射
根据实体类创建相应的表,这种简单的关系为hibernate基本映射。
User1实体类代码如下:
//user实体。 public classUser1 { //用户编号。 private String id; //名字。 private String name; //密码。 private String password; //创建日期。 private Date createTime; //失效时间。 private Date expireTime; public String getId() { return id; } // publicvoid setId(String id) { // this.id= id; // } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(Stringpassword) { this.password = password; } public Date getCreateTime() { return createTime; } public void setCreateTime(DatecreateTime) { this.createTime = createTime; } public Date getExpireTime() { return expireTime; } public void setExpireTime(DateexpireTime) { this.expireTime = expireTime; } }
User1.hbm.xml映射文件如下所示:
<hibernate-mapping package="com.bjpowernode.hibernate"> <class name="User1" table="t_user1"> <id name="id"column="user_id" length="32"access="field"> <generator class="uuid" /> </id> <!-- 设置主键不能重复和不能为空的属性. --> <property name="name" length="30"unique="true" not-null="true"/> <property name="password"/> <property name="createTime" type="date" column="create_time"/> <property name="expireTime"/> </class> </hibernate-mapping>
通过User1.hbm.xml映射文件将User1对象转换为关系数据库中的表t_user1。
转换出的结果如下所示:
2 对象关系映射
2.1 多对一关联映射(单向)
例如用户和组的关系就是多对一的关系,多个用户对应一个组。
将实体映射成表,将对应的实体映射成表。对应的属性映射成表字段。
多对一关联映射是在多的一端来维护关联字段,在我们这个例子中也就是在用户一端来维护关系字段。
User.hbm.xml文件。
<hibernate-mapping package="org.hibernate.auction"> <class name="com.bjpowernode.hibernate.User" table="t_user" > <id name="id"> <generator class="native" /> </id> <property name="name"/> <many-to-one name="group" column="groupid"cascade="save-update"></many-to-one> </class> </hibernate-mapping>
Group.hbm.xml文件。
<hibernate-mapping package="org.hibernate.auction"> <class name="com.bjpowernode.hibernate.Group" table="t_group"> <id name="id"> <generator class="native" /> </id> <property name="name"/> </class> </hibernate-mapping>
在这里我们看的代码就看*.hbm.mlx代码,因为对于类之间的关联,在实现时,一个类作为另一个类的私有成员,这一点在学UML建模的时候我们都懂了,在这里主要看的是ORM的M,也就是*.hbm.xml文件。
2.2 一对一关联映射
一对一关联映射在实际生活中是比较常见的,如人与家庭住址的关系,通过人这个对象可以找到他家庭住址相关的内容。
2.2.1 一对一映射(单向主键关联)
单向一对一主键关联,靠的是它们的主键相等,从Person中能看到IdCard,也就是把t_idCard中的主键拿过来当做t_Pseron的主键。
Xml文件中:
<class name="com.bjpowernode.hibernate.Person"table="t_person" > <id name="id"> <!-- 采用foreign生成策略,foreign会取得关联对象的标识 --> <generator class="foreign" > <!--property指的是关联对象。 --> <param name="property">idCard</param> </generator> </id> <property name="name"/> <!-- 一对一关联映射,主键关联. --> <!-- one-to-one标签指示hibernate如何加载其关联对象,默认根据主键加载. 也就是拿到关系字段值,根据对端的主键来加载关联对象. constrained="true",表示当前主键(Person的主键)还是一个外键 . 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句. --> <one-to-one name="idCard" constrained="true"/> </class>
<hibernate-mapping package="org.hibernate.auction"> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard" > <id name="id"> <generator class="native" /> </id> <property name="cardNo"/> </class> </hibernate-mapping>
一对一的关系是通过one-to-one元素定义的。
2.2.2 一对一映射(双向主键关联)
一对一双向主键关联与一对一单向主键关联的区别就是,一对一单向主键关联,在person端能看到idCard,而idCard不能看到Person端。而双向关联就是在idCard端也能看到person,也就是不但在Person.hbm.xml中加上eb3c88118c17ef85b056b8a514885a94标签,同时在IdCard.hbm.xml文件中加上eb3c88118c17ef85b056b8a514885a94标签。代码如下所示。
<hibernate-mapping package="org.hibernate.auction"> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard" > <id name="id"> <generator class="native" /> </id> <property name="cardNo"/> <one-to-one name="person"/> </class> </hibernate-mapping>
2.2.3 一对一映射(单向唯一外键关联)
一对一单向唯一外键关联,也就是多对一关联的特例,把多的一端限制为一,就是一对一唯一外键关联。同多对一一样,在一端加入另一端的并采用0f3b36ce07ca4f65616ce0254f1e356f标签,通过unique="true",这样来限制了多的一端为一。
先上代码。
IdCard.hbm.xml
<hibernate-mapping package="org.hibernate.auction"> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard" > <id name="id"> <generator class="native" /> </id> <property name="cardNo"/> </class> </hibernate-mapping>
Person.hbm.xml
<hibernate-mapping package="org.hibernate.auction"> <class name="com.bjpowernode.hibernate.Person" table="t_person" > <id name="id"> <!-- 采用foreign生成策略,foreign会取得关联对象的标识 --> <generator class="native" /> </id> <property name="name"/> <many-to-one name="idCard" unique="true"></many-to-one> </class> </hibernate-mapping>
图如下所示:
在t_pserson端加上一个外键字段idCard,限制idCard的唯一性就是一对一唯一外键关联。
2.2.4 一对一映射(双向唯一外键关联)
一对一唯一外键单向关联我们已经了解了,双向反过来就是在没有的一端加上就可以了。
我们的IdCard.hbm.xml中采用eb3c88118c17ef85b056b8a514885a94标签。
<hibernate-mapping package="org.hibernate.auction"> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard" > <id name="id"> <generator class="native" /> </id> <property name="cardNo"/> <one-to-one name="person" property-ref="idCard"></one-to-one> </class> </hibernate-mapping>
而person.hbm.xml同一对一唯一外键单向关联一样。
<class name="com.bjpowernode.hibernate.Person" table="t_person" > <id name="id"> <!-- 采用foreign生成策略,foreign会取得关联对象的标识 --> <generator class="native" /> </id> <property name="name"/> <many-to-one name="idCard" unique="true"></many-to-one> </class>
从上述中可以总结出,对于一对一关联映射,主键关联和唯一外键关联单向和双向产生出的表结构是一样的,不同的是在加载的时候不同。也就是一对一双向关联和一对一单向关联的相比,只是改变了一对一关联映射的加载,而没有改变存储。
2.3 一对多关联映射
2.3.1 一对多关联映射(单向)
上面我们介绍了多对一,我们反过来看一对多不就是多对一吗?那还用再进行不同的映射吗?有什么差别吗?一对多和多对一映射原理是一致的,存储是相同的,也就是生成的数据库的表是一样的,他们之间不同的是维护的关系不同。
他们之间不同点是维护的关系不同
多对一维护的关系是:多指向一的关系,有了此关系,加载多的时候可以将一加载上来。
一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来。
代码如下所示。
Class.hbm.xml
<class name="com.bjpowernode.hibernate.Classes" table="t_Classes" > <id name="id"> <generator class="native" /> </id> <property name="name"/> <set name="students"> <!-- <keycolumn="classesid" not-null="true"/> --> <key column="classesid" /> <one-to-many class="com.bjpowernode.hibernate.Student"/> </set> </class>
Students.hbm.xml
<class name="com.bjpowernode.hibernate.Student" table="t_student" > <id name="id"> <generator class="native" /> </id> <property name="name"/> </class>
从班级能看到学生,是班级来维护关系,不是学生来维护关系,学生不知道自己是哪个班,所以在存储学生的时候,班级的代码不知道。为了更新学生是哪个班级的要发出很多update语句来告诉学生是哪个班级的。当我们设置classesid not-null=“true”时,则将无法保存数据,解决办法我们改为双向关联映射。
2.3.2 一对多关联映射(双向)
为了解决一对多单向可能存在的问题,我们采用双向一对多,每一方都能维护对方。
一对多双向关联映射方式:
在一的一端的集合上采用42538adbdb6240b2b083a000a615d5bd标签,在多的一端加入一个外键。
在多的一端采用0f3b36ce07ca4f65616ce0254f1e356f的标签
!~注意42538adbdb6240b2b083a000a615d5bd标签和0f3b36ce07ca4f65616ce0254f1e356f标签加入字段保持一致,否则会产生数据混乱。
代码如下所示。
<class name="com.bjpowernode.hibernate.Classes" table="t_Classes" > <id name="id"> <generator class="native" /> </id> <property name="name"/> <set name="students" inverse="true"> <!-- <keycolumn="classesid" not-null="true"/> --> <key column="classesid" /> <one-to-many class="com.bjpowernode.hibernate.Student"/> </set> </class>
<class name="com.bjpowernode.hibernate.Student" table="t_student" > <id name="id"> <generator class="native" /> </id> <property name="name"/> <many-to-one name="classes"column="classesid"/> </class>
注意:Inverse属性
1、 Inverse中文意思为相反的,反转。在hibernate中inverse可以用在一对多和多对多双向关联上,inverse默认是false,为false的时候表示本端可以维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效,所以在一对多关联映射我们通常在多的一端维护关系,让一的一端失效。
2、Inverse是控制方向上的反转,只影响存储。
比较一对多单向和双向映射,从存储结构上看没有什么区别,但是从配置文件上看,一对多双向比一对多单向,一对多双向关联的配置文件中在多的一端的配置文件上存在0f3b36ce07ca4f65616ce0254f1e356f相关配置,即保证多对一的映射。
2.4 多对多关联映射
2.4.1 多对多关联映射(单向)
多对多对象关系映射,需要加入一张新表完成基本映射。如下图所示。
代码。
Role.hbm.xml
<class name="com.bjpowernode.hibernate.Role" table="t_role"> <id name="id"> <generator class="native" /> </id> <property name="name"/> </class>
User.hbm.xml
<class name="com.bjpowernode.hibernate.User" table="t_user" > <id name="id"> <generator class="native" /> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="user_id"/> <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id"/> </set> </class>
2.4.2 多对多关联映射(双向)
双向多对多对象关系映射,是两端都能将对方加载上来,双向都需要加上标签映射。
要注意:
生成中间表名必须一样
生成中间表字段必须一样
代码如下所示。
Role.hbm.xml
<class name="com.bjpowernode.hibernate.Role" table="t_role"> <id name="id"> <generator class="native" /> </id> <property name="name"/> <set name="users" table="t_user_role"> <key column="role_id"/> <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/> </set> </class>
User.hbm.xml
<class name="com.bjpowernode.hibernate.User"table="t_user" > <id name="id"> <generator class="native" /> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="user_id"/> <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id"/> </set> </class>
区别:单向多对多和双向多对多存储结构没有任何的区别,但他们的映射文件是有区别的,加载过程是不同的。
3 关系映射总结
综上所述,可以看出,同一类映射,无论是单向还是双向,他们的存储结构是相同的,之所以映射文件不同,是因为加载时不同(在增删改时)。
无论是多对一、一对多、一对一还是多对一,A对B,A就是主动方,A主动想要了解B的情况,这样把B设置到A端。而双向,也就是A对B,A想了解B的信息,而B也想了解A的信息,那就要同时把A设置到B端了。
【相关推荐】
1. 特别推荐:“php程序员工具箱”V0.1版本下载
2. Java免费视频教程
3. 阿里巴巴Java开发手册
Atas ialah kandungan terperinci Hibernate两种类映射的实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

在SpringBoot项目中集成Hibernate前言Hibernate是一个流行的ORM(对象关系映射)框架,它可以将Java对象映射到数据库表,从而方便地进行持久化操作。在SpringBoot项目中,集成Hibernate可以帮助我们更轻松地进行数据库操作,本文将介绍如何在SpringBoot项目中集成Hibernate,并提供相应的示例。1.引入依赖在pom.xml文件中引入以下依赖:org.springframework.bootspring-boot-starter-data-jpam

Java是一种面向对象编程语言,它被广泛地应用于软件开发领域。Hibernate是一种流行的Java持久化框架,它提供了一种简单且高效的方式来管理Java对象的持久化。然而,开发过程中经常会遇到Hibernate错误,这些错误可能会导致程序的异常终止或者不稳定。如何处理和避免Hibernate错误成为了Java开发者必须掌握的能力。本文将介绍一些常见的Hib

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。详细介绍:1、实现方式,Hibernate是一个完整的对象/关系映射解决方案,将对象与数据库表进行映射,MyBatis则需要开发者手动编写SQL语句以及ResultMap;2、性能,Hibernate在开发速度上可能比MyBatis快,因为Hibernate简化了DAO层等等。

在本文中,我们将看到如何在Hibernate中执行批量插入/更新。每当我们执行一条sql语句时,我们都是通过对数据库进行网络调用来完成的。现在,如果我们必须向数据库表中插入10个条目,那么我们必须进行10次网络调用。相反,我们可以通过使用批处理来优化网络调用。批处理允许我们在单个网络调用中执行一组SQL语句。为了理解和实施这一点,让我们定义我们的实体−@EntitypublicclassParent{@Id@GeneratedValue(strategy=GenerationType.AUTO)

Hibernate的一对多和多对多Hibernate是一个优秀的ORM框架,它简化了Java应用程序与关系型数据库之间的数据访问。在Hibernate中,我们可以使用一对多和多对多的关系来处理复杂的数据模型。Hibernate的一对多在Hibernate中,一对多关系是指一个实体类对应多个另一个实体类。比如,一个订单(Order)可以对应多个订单项(OrderItem),一个用户(User)可以对应多个订单(Order)。要在Hibernate中实现一对多关系,需要在实体类中定义一个集合属性来存

Java框架技术栈:介绍常用的Java框架,如SpringMVC、Hibernate、MyBatis等随着Java的不断发展,越来越多的框架被开发出来以简化开发过程。其中,SpringMVC、Hibernate、MyBatis等是Java开发中最常用的框架之一。本文将介绍这些框架的基本概念和使用方法,帮助读者更好地理解和应用这些框架。第一,我们来介绍Sp

Hibernate是一个开放源码的ORM框架,它将关系型数据库和Java程序之间的数据映射相互绑定,这样可以使开发人员更方便地访问数据库中的数据。使用Hibernate框架可以大量减少编写SQL语句的工作,提高应用程序的开发效率和可重用性。下面从以下几个方面来介绍Hibernate框架。一、Hibernate框架的优点对象关系映射,隐藏数据库访问细节,使开发

缓存有助于减少执行查询时的数据库网络调用。一级缓存与会话链接。它是隐式实现的。一级缓存存在直到会话对象存在为止。一旦会话对象终止/关闭,将会有没有缓存对象。二级缓存适用于多个会话对象。它是链接的与会话工厂。二级缓存对象可供所有会话使用单会话工厂。当特定会话发生时,这些缓存对象将被终止工厂已关闭。实现二级缓存我们需要添加以下依赖项才能使用二级缓存。<!--https://mvnrepository.com/artifact/net.sf.ehcache/ehcache--><de


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

DVWA
Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

SublimeText3 versi Inggeris
Disyorkan: Versi Win, menyokong gesaan kod!

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini
