您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 会议纪要 > hibernate_02_多对多_多对一_关联查询资料
Hibernate目录:自动到手配置一个hibernate环境表与表之间的关系1对1,多对1/1对多,多对多。--bag,list,set级联-cascade,inversHQL语句再说明-fromSomeClass关联查询条件查询-在关联查询与直接将数据封装成map,JavaBean或是直接返回object[].使用定义的SqL-在xml中定义。使用原生的sql。表与表之间的关系1对1.-一个表的主键对应另一个表的主键。1对多,多对1.-一个表的主键对应另一个表的外键。多对多。-使用第三方表完成多对多。1对多的最简单实现:-外表只有一个列-简单映射一个项目可以拥有多张图片。/*最简单的set影射,一个项目有多张图片*/createtableitem(item_idintprimarykey,item_namevarchar(30));createtableimage(image_idint,image_namevarchar(30));1对多的最简单实现:-外表只有一个列实现具体操作:-保存/查询:保存查询使用注解实现的简单的一对多:复杂的一对多实现,每张表一个实例Bean:1对多,多对1关联:一个人可以拥有多辆汽车。在Person方,使用set进行关联://--以下是多方:在Car方为many-to-one,fetch写在哪边就影响从这一边到另一边的查询many-to-onename=personclass=cn.itcast.asso.Personfetch=select//指定本类所对应的表中的外键字段名columnname=car_personidlength=32//many-to-onesetname=“cars”inverse=“true”--inverse将此值修改成false或是直接删除此配置项目-后面讲-----说明是否放弃维护表关系true时将放弃,即不会自动关联idkey多方,即明细方的外键字段名columnname=car_personidlength=32//keyone-to-manyclass=“cn.itcast.asso.Car”///在person方为one-to-many/set代码:修改配置文件如下:-直接使用级联保存:inverse:是否要放弃维护表之间的关系。false是不放弃,即维护表之间的关系。级联和关系维护cascade和inverse(Employee–Department)Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:none,all,save-update,delete,lock,refresh,evict,replicate,persist,merge,delete-orphan(one-to-many)。一般对many-to-one,many-to-many不设置级联,在one-to-one和one-to-many中设置级联。inverse表“是否放弃维护关联关系”(在Java里两个对象产生关联时,对数据库表的影响),在one-to-many和many-to-many的集合定义中使用,inverse=”true”表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。注:配置成one-to-one的对象不维护关联关系使用带关联的查询1:即可以从Person查询出他的所有汽车,也可以从某个car中获取它的主人信息。但这种方式可以通过设置lazy=true|false的方式来加以限制。任何方便的操作,都是以消耗性能为代价的。从一个对象中获取关系的另一方信息使用带关联的查询2:查询拥有车号为888的车主查询谁拥有什么车使用带关联的查询3:-将查询结果直接封装成Map:使用带关联的查询4:使用Criteira的createAlias方法以上代码返回的数据形式仍然为ListPerson类型。但如果某个Person拥有两部车,则会出现重复的Person使用带关联的查询5:-高级查询也可以使用以下查询,代替上面的查询:使用List关联另一方:再很多情况下,我们已经习惯使用List进行数据操作,这在Hibernate的只需要的简单的修改,即可以实现:-声明成List,并使用bag进行影射:具体操作略。用注解实现的一对多:主表外表动态模型(Dynamicmodels)运行期的持久化实体没有必要一定表示为像POJO类或JavaBean对象那样的形式。Hibernate也支持动态模型(在运行期使用Map的Map)和象DOM4J的树模型那样的实体表示。使用这种方法,你不用写持久化类,只写映射文件就行了。动态模型组件的配置/查询:使用Map保存动态模型:1对1关系:1对1影射关系,一般情况非常少见。1对1中,一般为一个表的主键对应另一个表的主键或是对应另一个表的unique列。•基于主键的一对一。•基于主键对唯一键的一对一。一对一(Person-IdCard)基本主键对主键的一对一。外表中主键的值,从主表中查询获取:1对1关系:---基于主键对主键的一对一DROPTABLEhuman;CREATETABLEhuman(idINTPRIMARYKEY,NAMEVARCHAR(20));DROPTABLEidCard;CREATETABLEidCard(idINTPRIMARYKEY,NAMEVARCHAR(20),addrVARCHAR(50));ALTERTABLEidCardADDCONSTRAINTidCard_fkFOREIGNKEY(id)REFERENCEShuman(id);1对1的配置文件:-基于主键对主键的一对一:基于主键的一对一:保存/查询保存查询使用HQL查询:基于注解的1对1:主键对主键测试代码:查询,通过一个对像查询出另一个对像:1对1关联的另一种方式:-基于主键对唯一的一对一:一对一(Person-IdCard)2)基于外健的one-to-one,可以描述为多对一,加unique=“true”约束one-to-onename=”idCard”property-ref=“person”/many-to-onename=”person”column=”person_id”unique=”true”not-null=”true”/配置文件:主键对唯一增加操作:使用注解实现的一对一:主键对唯一键主多对多-关联映射-使用中间表进行关联影射:多对多(teacher-student)在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。setname=teachertable=teacher_studentkeycolumn=teacher_id/many-to-manyclass=Studentcolumn=student_id//setteacherPKidnamestudentPKidnameteacher_studentPK,FK1teacher_idPK,FK2student_id多对多-单向关联-从Teacher到Student(必须手工完成)配置文件:多对多关联让关联工作:-:保存:多对多查询:以下查询出,某些老师带哪些学生。使用注解实现的多对多:核心问题:•@ManyToMany•@Cascade•@JoinColumn其他关系:--组件映射:-通常使用组件映射来表达一些依赖关系组件映射(User-Name)关联的属性是个复杂类型的持久化类,但不是实体即:数据库中没有表与该属性对应,但该类的属性要之久保存的。componentname=”name”class=”com.test.hibernate.domain.Name”propertyname=”initial”/propertyname=”first”/propertyname=”last”//component当组件的属性不能和表中的字段简单对应的时候可以选择实现:org.hibernate.usertype.UserType或org.hibernate.usertype.CompositeUserType组件映射-示例使用其他影射-简单了解:除了前面在多对1时使用Set,和Bag之外,还可以使用List或是Map来影射,但List和map必须指定额外的值,如List要指定下标,map要指定Key.-在真实的开发中,很少使用List和map.另有一种集合是Array.就不做介绍了。使用List进行影射:-注意区分List与Bag的区别:使用注解完成-List的1对多:使用map进行影射-需要指定key值:选择合适的集合影射你的类:建议使用set.建议使用bag.其他关系:继承-使用一张表:此种情况用的不是很多,一般用于在一张表中通过父子类来表达父子关系。其他影射-继承每个子类一张表:用此种方式用的非常少见下面的备注部分。级联和关系维护的---再讨论cascade和inverse(Employee–Department)Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:none,all,save-update,delete,lock,refresh,evict,replicate,persist,merge,delete-orphan(one-to-many)。一般对many-to-one,many-to-many不设置级联,在one-to-one和one-to-many中设置级联。inverse表“是否放弃维护关联关系”(在Java里两个对象产生关联时,对数据库表的影响),在one-to-many和many-to-many的集合定义中使用,inverse=”true”表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。注:配置成one-to-one的对象不维护关联关系cascade经常使用的值说明:all:所有情况下均进行关联操作。none:所有情况下均不进行关联操作。这是默认值。save-update:在执行save/update/saveOrUpdate时进行关联操delete:在执行delete时进行关联操作.delete-orphan:当save/update/saveOrUpdate时,相当于save-update;当删除操作时,相当于delete;,即相当于save-update,delete.--------------------casecade设置应该出现在one-to-many方。如果是many-to-many则一方出现cascade即可。inverse不可以用在List,array等有序的集合中。综合练习:权限管理:用户、功能、角色。要求:每个人可以拥有多种不同的角色。要求:每个角色可以拥有多个功能。当用户登录时,应该根据用户的角色显示他所具体的所有功能。
本文标题:hibernate_02_多对多_多对一_关联查询资料
链接地址:https://www.777doc.com/doc-3682929 .html