单向多对一关联映射:many-to-one:
1、 所谓的关联就是对象和对象之间在某段时间范围内(是可以持续一段时间的),存在有联系,即关联可以在一开始不存在,后来才建立起来,然后还可以取消和改变如:通过对象A.setB(对象B)建立或更新关联--通过A.setB(null)取消关联
2、 判断关联的多重性:首先站在任何一端的某一个对象的角度判断跟对方那端的多少个对象有联系,如果只有一个的话那么就可以确定对方的多重性是1,如果从对方看我这端有多个的话,那么就确定了这两个对象关联的多重性-----------多对一或者一对多。因此多重性是要双方都确定了对方才能决定关联的多重性
3、 由上可知,关联有双向和单向之分,从A能访问到B,或许从B也能访问到A
4、 将内存中的关联信息,存储到数据库;从数据库中取出数据,并在内存中重建关联
5、 先看单向的多对一关联:<many-to-one name="group" column="groupId"/>其中的name指的是这个与对象Person关联的对象——Group,一般是Person实体中的一个属性,持有对Group的引用,一般情况下,在数据库中的字段名可改成上面的groupId,表明他与Group的联系,因此column是作这个用的
6、 一般先有“一”,然后再有“多”,从“多”一端,建立和“一”之间的关联;这样可以避免先建立多再一的情况下而发出的多余的update语句。就像平常我们的QQ一样也是先有群,然后群下有一堆人
7、 多对一关联映射的RUD重建关联:
8、 关联的重建:Person cp1 = (Person)session.load(Person.class, 1); cp1.getGroup().getName();关联已经被重新建立起来,所以可以直接导航到对应的Group对象,发出了两条sql查询语句分别查询Person及其关联的对象Group
9、 关联的更新:可以像先前那样先load上来然后再update这个关联的Group;也可以这样->直接new出关联对象Group,然后改变Person的group引用,当然这个Group只要设置上id就行了,因为更新的是Person对象而不是Group,所以这是可以的,也是我们平时常用的方式。关联的删除一开始讲了很简单:p.setGroup(null)
单向一对多关联映射one-to-many:
1、 要注意到一对多关联其实也就是多对一的关联,映射的时候是由一的端指向多的一端并在多的一端加个关联标识去维护他,因此一对多和多对一的数据库表结构是完全一样的,只不过配置上会有些不同
<set name="persons"><key column="groupId"></key>
<one-to-many class="cn.com.leadfar.hibernate3.ContactPerson"/>
</set>
2、 属性name跟上面是一样的,指的是对关联的对象的引用;跟多对一一样也要在多的一端增加个字段去维护这个关联关系,这是<key>就是干这个的其column属性表示的是在对方那张表里面增加一个字段(也就是person这张表),然后指定对方是谁:使用one-to-many中的class说明对方是谁
3、 一对多单向关联的维护:保存时主要对集合的使用,这时update语句就去不掉了,因为多的一端没有维护他们之间关联的属性,但他却在数据库中多的一端加入了一个字段维护了,因此一对多单向关联是很少见的;
Group g = (Group)session.load(Group.class, 2);
Person cp = (Person)session.load(ContactPerson.class, 3);
g.getPersons().add(cp);
对集合操作要特别小心:在组下添加人时,可能会陷入下面的误区;
Set<ContactPerson> cps = new HashSet<ContactPerson>();
cps.add(cp);
g.setPersons(cps);
这样会把原来已有的关联的其他记录给置空了
4、 删除关联:
Group g = (Group)session.load(Group.class, 2);
//清空集合,会导致关联关系被删除
g.getPersons().clear();
其实他们两个对象都没删除掉,只是其关联被删除了
5、 集合上的lazy:true|false|extra
Lazy=extr是一种比较聪明的懒加载策略,比如在取集合中有多少个对象或是否包含有某个对象的时候,会发出智能语句,如:count(id)
select 1 from t_person where groupId =? and id =?包含
一对多的双向关联:
1、 注意配置时,多对一的column要与一对多中key的column要保持一致,他们都是共同维护关联的字段或属性,可以从任意一端去维护他们之间的关系,强烈建议在多的一端维护关联关系
2、 当更新一离线对象时,会出现更新一端引起的多端关联关系的丢失,因为一端的引用到的多端是空的,但如果是持久化对象的话,则关联维护着不会丢失;虽然上面load持久化不会丢失关联,但这用在典型的多层架构中是不太现实的,比如Struts2中用ModelDriven更新Group,Group里边有20个属性,先传个id到后台,加载一个Group到页面并呈现出这20个属性来,在jsp界面改变某些属性然后提交给Action,从页面里面传递到Action中的Group是没有集合的数据的,如果你把这个Group对象当做Model的话,从页面里面递交的参数它改的只是Group而已,而他的那些关联我们可能不希望改变它,那么这时候就需要在后台先load下,然后再改变非关联的属性,只能这样改,这会给我们带来很大的麻烦
3、
因此最常见的是更新离线对象,为了不让关联丢失,可以设置集合上的inverse属性,以维持关联关系,让多的一端维护关联关系。下面就不会出现关联丢失了
//更新Group对象
Group g = new Group();
g.setId(2);
g.setName("敌人");
4、 inverse属性:在双向关联中表示由谁来维护表与表之间的关系,由对方维护设置inverse=true,在单向关联中没有这种说法。
级联cascade:
1、 持久化对象是不能引用到瞬时对象的,但他可以引用到离线的对象,所谓离线的对象就是有数据库标识的id对象而瞬时对象却没有这个标识,这有点区别的。比如在关联保存对象时不小心引用到瞬时对象的话就会抛出TransientObjectException异常
如上面的g就是个瞬时的对象,而cp在save操作后会变成持久化对象的,但他发现他的引用Group是瞬时的,则抛出上面的异常,如果给Group设个id标识,则能同步到数据库中去
2、 解决上述的问题,就要引入到Hibernate中的一个重要属性cascade属性,一般选择all,这样的话CUD操作就会将持久化对象和引用到的瞬时对象同步到数据库中,上面的保存也就没有问题
3、 删除操作:删除某一端某条记录的话,同时会把与它相关联的那端的那条记录也删掉,但这是有风险的,万一关联的那端还有其他对象引用的话,会抛出外键关联约束的异常。Person p = (Person)session.load(Person.class, 3);然后执行session.delete(p);注意发出两条delete语句
4、 删除操作:删除一个离线对象即new一个Person然后set它的Id为3吧,然后执行delete操作,这是只发出一条删除该Person的操作,并没有把他的级联的对象Group里面的那条记录给删除掉。因为delete操作不是个持久化对象,因此他就不可能知道他的关联对象,因此也就不能删除它的关联对象,这是cascade就失效了
分享到:
相关推荐
例如,一个用户可能有多个订单,这种一对多的关系就可以通过关联映射来实现。关联映射可以通过XML配置文件或注解完成,确保对象间的关联能够在数据库层面得到正确的反映。 接下来,我们详细探讨“cascade”。...
总之,理解并正确实现Hibernate中的一对多双向关联映射是提升应用程序性能和数据一致性的重要步骤。通过细心配置映射文件,编写相应的实体类,以及妥善处理关联关系的维护,我们可以有效地管理复杂的数据结构。
本篇文章将深入探讨 Hibernate 中的一对多双向关联映射。 在数据库设计中,一对多关联是指一个实体可以与多个其他实体相关联,比如一个学生可以有多个课程,一个部门可以有多名员工。在Hibernate中,这种关系可以...
总之,理解和熟练运用Hibernate的一对多、多对一以及双向关联,是提升Java企业级应用开发效率的关键。通过注解或XML配置,开发者可以灵活地定义实体间的关联,实现数据的持久化。同时,注意级联操作、懒加载策略等...
本篇将详细讲解如何在Hibernate中实现一对多的双向关联,并提供相关的代码示例。 在关系型数据库中,一对多关联是指一个表的记录可以对应另一个表的多个记录。在Hibernate中,这种关系可以通过在实体类和映射文件中...
最后,实践是检验理论的最好方式,你可以参考提供的压缩包文件`hibernate_1700_many2many_bidirectional`,里面可能包含了示例代码和测试用例,通过实际运行和调试加深对Hibernate多对多双向关联的理解。通过这种...
标题"Hibernate双向一对多"指的是Hibernate框架中的一个重要关系映射概念,即在一个实体类中,一个实例可以与多个另一个实体类的实例相关联,而在另一个实体类中,每个实例也可以关联到该实体类的一个实例。...
总结,`inverse=true`是Hibernate中管理双向一对多关联的重要属性,它影响了对象与数据库之间的同步策略。理解并正确运用这个特性,有助于我们编写出更加高效、易维护的代码。通过阅读相关博客和源码,我们可以更...
在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...
在生成的XML文件中,我们可以看到订单和订单明细之间的一对多关系被正确地映射。OrderId属性被映射到订单表的OrderId列上,而OrderDetail类的OrderId属性被映射到订单明细表的OrderId列上。 双向映射是指父对象和子...
在Java持久化框架Hibernate中,一对多映射是常见的实体关系映射类型,它表示一个实体(例如User)可以与多个其他实体(例如Account)相关联。以下是对Hibernate一对多映射配置的详解: 一、XML文件配置 1. 单向...
通过上述配置,可以有效地管理和操作一对多的关联关系。 综上所述,了解并掌握Hibernate中的关联映射及其常用属性对于开发高质量的应用程序至关重要。这些属性不仅能够帮助我们更高效地进行数据库操作,还能极大地...
关联映射主要包括四种类型:一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)。下面我们将逐一探讨这些关联映射的配置方法。 1. **一对一关联映射** - **主键关联**...
Troop通过troop属性和Soldier建立一对多的双向关联,在mappedBy端不必也不能再定义任何物理映射。 对于一对多的双向映射,如果要一对多这一端维护关联关系,你需要删除mappedBy元素并将多对一这端的@JoinColoumn的...
在ORM中,关联关系是数据库表之间的连接,如一对一、一对多、多对一和多对多关系。 1. **一对一关联(OneToOne)**:这种关系意味着一个实体仅与另一个实体的一个实例相关联。在Hibernate中,可以通过@OneToOne注解...
当两个实体之间存在双向关联时(如一对多或许多对一的关系),`inverse`属性的设置变得尤为重要。本文将深入探讨`inverse`属性的作用、配置方式及其在实际应用中的意义。 #### Hibernate中`inverse`属性的基本概念 ...
描述提到“使用cascade和inverse优化区和街道关联关系”,这意味着我们将深入理解Hibernate的cascade和inverse属性,以及它们在双向一对多关联关系中的应用。 Hibernate是Java领域中广泛使用的对象关系映射(ORM)...
在给定的代码片段中,主要介绍了如何在`Room`和`UserInfo`两个实体之间建立一对多的双向关联,并通过`inverse`属性控制关联的维护方。 #### 四、Room和UserInfo类设计 首先来看`Room`和`UserInfo`两个实体类的设计...
2. **双向关联**:在一对多关系中,关联可以是单向或双向的。单向关联仅在一个实体类中可见,而双向关联允许两个实体类互相引用。双向关联需要在双方都进行配置,通常使用`@ManyToOne`和`@OneToOne`注解。 3. **...