码农小汪-Hibernate学习2-Mapping associations关联映射

本文主要是介绍码农小汪-Hibernate学习2-Mapping associations关联映射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

重要的事情说三遍,说三遍。即使英文不好,看教程的时候还是尽量的百度一哈英文解释是什么,为啥子这么说呢,你好哈,就想我们写变量哈,都是尽可能的让名字通俗易懂,一看就知道这个啥啥意思。理解英文我们就知道了,这个到底是啥.xiao wang的英语也是很差的,初三的考高中75分。高中的时候英语的基础几乎为零吧,所以我们不要放弃。

what is Mapping associations?

So far we have mapped a single persistent entity class to a table in isolation 持久对象实体到table的映射。

package org.hibernate.tutorial.domain;public class Person {private Long id;private int age;private String firstname;private String lastname;public Person() {}// Accessor methods for all properties, private setter for 'id'}Next, create the new mapping file as
Person.hbm.xml 我们可能分为不同的开发人员去完成这些工作,所以最后的时候可能集成到一起,把所有的文件搞定放在一起就好了
<hibernate-mapping package="org.hibernate.tutorial.domain"><class name="Person" table="PERSON"><id name="id" column="PERSON_ID"><generator class="native"/></id><property name="age"/><property name="firstname"/><property name="lastname"/></class></hibernate-mapping>
上面的属性,还可以指定type,cloumn,length....对应在数据表中的属性
Finally, add the new mapping to Hibernate's configuration:
<mapping resource="org/hibernate/tutorial/domain/Person.hbm.xml"/>

A unidirectional Set-based association

基于集合的单向关联
一个person关联了一系列的events。和为单向的,我们可以通过person了解到有关的events,但是不能通过events了解到我们的person。简单来说这个就是单向的关联
we choose a java.util.Set because the collection will not contain duplicate elements。例子中选择set不存在相同的

public class Person {private Set events = new HashSet();public Set getEvents() {return events;}public void setEvents(Set events) {this.events = events;}
}

“many” valued on both sides is called a many-to-many association. Hence, we use Hibernate’s many-to-many mapping:

<class name="Person" table="PERSON"><id name="id" column="PERSON_ID"><generator class="native"/></id><property name="age"/><property name="firstname"/><property name="lastname"/><set name="events" table="PERSON_EVENT">//提供中间的表<key column="PERSON_ID"/>//当前表中的key<many-to-many column="EVENT_ID" class="Event"/>//其他表中的key,然后合成为新的表</set></class>
这个有点N:M的关系

生成的表
和我在数据库中学习的类似,为了避免数据冗余。生成一些不必要的东西,但是这个查询起来需要联合两三个表

  private void addPersonToEvent(Long personId, Long eventId) {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();Person aPerson = (Person) session.load(Person.class, personId);Event anEvent = (Event) session.load(Event.class, eventId);aPerson.getEvents().add(anEvent);session.getTransaction().commit();}

现在就可以直接的使用这些数据了,简单直接滴。加载后Person和一个Event使用,只需修改集合 正常的收集方法。 没有显式的调用update()或save(); Hibernate自动检测到收集已被修改 和需要更新。 这就是所谓的自动的检查

值类型的集合

Let’s add a collection of email addresses to the Person entity. This will be represented as a java.util.Set of java.lang.String instances:

 private Set emailAddresses = new HashSet();public Set getEmailAddresses() {return emailAddresses;}public void setEmailAddresses(Set emailAddresses) {this.emailAddresses = emailAddresses;}The mapping of this Set is as follows:
<set name="emailAddresses" table="PERSON_EMAIL_ADDR">//外表的名字<key column="PERSON_ID"/>//外表中的外键<element type="string" column="EMAIL_ADDR"/></set>

这里写图片描述
这里没有描述很多。

Bi-directional associations

双向关联哦!·
Next you will map a bi-directional association. You will make the association between person and event work from both sides in Java. The database schema does not change, so you will still have many-to-many multiplicity.接下来你将地图一个双向关联。 你会让 人之间的关系和事件两边工作 在Java中。 数据库模式不改变,所以你还是会 多对多的多样性。
First, add a collection of participants to the Event class:
因为现在双方都可以访问对方了,一个Events可能对应多个persoon

private Set participants = new HashSet();public Set getParticipants() {return participants;}public void setParticipants(Set participants) {this.participants = participants;}Now map this side of the association in Event.hbm.xml.<set name="participants" table="PERSON_EVENT" inverse="true"><key column="EVENT_ID"/><many-to-many column="PERSON_ID" class="Person"/></set>

inverse adj.相反的;逆向的;倒转的;n.相反;倒转;相反的事物;vt.使倒转;使颠倒;
注意在两个映射文件中,互换了 key 和 manyto-many 的字段名。这里最重要的是 Event 映射文件里增加了 set 元素的 inverse=”true” 属性。
这意味着在需要的时候,Hibernate 能在关联的另一端 — Person 类得到两个实体间关联的信息。这将会极大地帮助你理解双向关联是如何在两个实体间被创建的。 这个属性很难理解哦,为啥子,两个相互依赖的东西,都不是null时候,如果其中的一个属性没有创建,另外的也是没有创建,那时候两个都不可以创建啦
What about the inverse mapping attribute? For you, and for Java, a bi-directional link is simply a matter of setting the references on both sides correctly. Hibernate, however, does not have enough information to correctly arrange SQL INSERT and UPDATE statements (to avoid constraint violations). Making one side of the association inverse tells Hibernate to consider it a mirror of the other side. That is all that is necessary for Hibernate to resolve any issues that arise when transforming a directional navigation model to a SQL database schema. The rules are straightforward: all bi-directional associations need one side as inverse. In a one-to-many association it has to be the many-side, and in many-to-many association you can select either side.
是怎样的inverse映射属性? 为你,和Java,双向 链接是一个简单的事双方正确设置引用。 然而,Hibernate不会 有足够的信息来正确地安排SQLINSERT和UPDATE语句(以避免约束违反)。 协会的一边inverse告诉Hibernate考虑它镜子的另一边。 这都是必要的 Hibernate解决出现的任何问题将定向导航模型的时候出现 一个SQL数据库模式。 规则很简单:所有双向关联 需要一方inverse。 在一对多关联是多方位的, 多对多关联,你可以选择任何一方。 这个很重要,不然后面的更烦的东西理解不来。

大概的意思就是,有inverse属性的一方我们创建持久对象的时候可以忽悠他,即使没有创建也不会错误!我们把当前对象创建了之后,然后又Inverse属性的一个,可以引用我们的当前的对象创建持久对象,反之,刚刚没有引用的对象,现在创建出来了,那么我们现在可以使用啦,所以这个对于我们来说是没得问题的啦!

看英文很累,虽然有翻译,但是我觉得还是原味的英文看起来舒服一点,虽然很烦躁,但是还得慢慢的来吧!文档,文档,文档一定要看。特别是使用我们的框架之类的吧。

这篇关于码农小汪-Hibernate学习2-Mapping associations关联映射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/239818

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件