




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章实体关系关联映射Hibernate基础回顾C3P0数据库连接池的配置Hibernate映射基础@MappedSuperclass/@Table/@Column/@Id/@GeneratedValue/@SequenceGeneratorJPAID生成策略IDENTITY/SEQUENCE/TABLE/AUTOHibernate数据类型基本数据类型、JDBC数据类型、自定义数据类型Hibernate对象生命周期三种状态特征、区分、转换,持久态对象特性目标理解各个关联关系映射中数据建模掌握并熟练应用一对一关联掌握并熟练应用一对多关联掌握并熟练应用多对多关联ORM映射规则类/表映射属性/字段映射Mapclassassociationstotables’foreignkeyrelationships1:1/1:m/m:nMapobjects(instancesofclasses)totablerows一对一关联一对一关联包括两种实现形式:唯一外键关联共享主键关联唯一外键关联唯一外键关联的一对一关系只是一对多关系的一个特例;唯一外键的实现是通过一方的主键作为另一方关联表的外键,并对外键做唯一性限制;唯一外键关联样例
—数据模型idnameidnameHusband_id@Entitypublic
class
HusbandextendsBaseEntity{privateStringname;@OneToOne(mappedBy="husband")privateWifewife;@Entitypublic
class
WifeextendsBaseEntity{privateStringname;@ManyToOne@JoinColumn(name="husband_id",unique=true)privateHusbandhusband;唯一外键关联样例—
POJO类片段(1)先配置有外键的一端——Wife端,通过@JoinColum指定外键,另一端——husband,只需要@OneToOne通过mapby指向对方关联husband的属性Wife端通过@ManyToOne指定unique来限定一对一关系;共享主键关联样例
-摘要idnameidnoCitizen_id市民社保卡共享主键关联(1)如果两张表是通过这种一对一关系相关联的,那么这两张表就共享同样的主关键字值同样需要先配置有外键的一端security_no这种方式很复杂,并且没有唯一外键的方式易维护,尽量不要使用@Entitypublic
classSecurityNo{//共享主键生成策略,自己的主键是通过nvShen的主键来确定了@Id@GeneratedValue(generator="fk")@GenericGenerator(name="fk",strategy="foreign",parameters={@Parameter(value="citizen",name="property")})privateIntegerid;privateStringno;@OneToOne@PrimaryKeyJoinColumnprivateCitizencitizen;共享主键关联(2)不维护关系的一端——Citizen,仍然只需要配置一个mappedBy即可@Entitypublic
classCitizenextendsBaseEntity{privateStringname;@OneToOne(mappedBy="citizen")privateSecurityNosecurityNo;一对多关联一对多关联是应用最广泛的关联,一对多关联包括两种形式:单向一对多关联双向一对多关联(多对一+一对多)单向多对一(尽量不要使用)一对多关联—数据模型idnameidnameageclasses_id对于Classes来说,是一对多关系对于Student来说,是多对一关系多对一关联—
POJO类片段维护关系端(含有外键的一端)——Student,无论是单向还是双向,配置都是相同的,而且仍然是先配置,还是使用@JoinColum来指定外键@Entitypublic
classStudentextendsBaseEntity{privateStringname;privateIntegerage;@ManyToOne@JoinColumn(name="classes_id")privateClassesclasses;一对多关联—
映射配置(1)@Entitypublic
classClassesextendsBaseEntity{privateStringname;@OneToMany(mappedBy="classes)@OrderBy(value="agedesc")//可以根据Student的一个或多个属性排序privateList<Student>stuList=newArrayList<>();@OneToMany(mappedBy="classes")privateSet<Student>stuSet=newHashSet<>();@OneToMany(mappedBy="classes")@MapKey(name="name")//指定键对象使用的属性privateMap<String,Student>stuMap=newHashMap<>();本例是双向关联时集合属性必须实例化,List时可以指定排序,Map时需要指定键双向关联时,没有外键端,永远是mappedByinverse属性mappedBy(hibernate遗留的xml映射文件是inverse属性)反转,用来指定维护关系的方向,这里指的都是含有外键的一端。没有外键的一端一律使用mappedBy,如违反这个最佳实践,那么看如下的反例——单向一对多。这就是尽量不要单向一对多的原因@Entitypublic
classMasterextendsBaseEntity{privateStringname;@OneToMany@JoinColumn(name="master_id")privateList<Pet>pets=newArrayList<>();@Entitypublic
classPetextendsBaseEntity{privateStringname;privateIntegerage;多对多关联多对多关联是最复杂的一个关联,需要一个中间表来维护两端的id有两种方式来表达多对多关系中间的关联表除了两端的外键,还有其他字段,形成了两个一对多关系,对于两端来说,就是多对多关系,就是前边涉及的一对多双向关联,只不过是两对中间的关联表只有两端的外键,无需对应实体类多对多关联—数据模型idnameidnameUndergraduate_idCourse_id多对多关联样例—
POJO类片段(1)多对多关联先配置维护关系端使用@JoinTable指定关联表名,两端的外键名@Entitypublic
classUndergraduateextendsBaseEntity{privateStringname;@ManyToMany@JoinTable(name="undergraduate_course",//关联表的表名//关联当前表的外键名joinColumns=@JoinColumn(name="undergraduate_id"),//关联对方表的外键名inverseJoinColumns=@JoinColumn(name="course_id"))privateList<Course>courseList=newArrayList<>();多对多关联样例—
POJO类片段(2)多对多关联另一端仍然只需要一个mappedBy@Entitypublic
classCourseextendsBaseEntity{privateStringname;@ManyToMany(mappedBy="courseList")privateList<Undergraduate>xueShengList=newArrayList<>();多对多关联样例—
持久化@Testpublic
voidtest10(){Courseenglish=newCourse();english.setName("英语");Coursebiology=newCourse();biology.setName("生物");Coursemath=newCourse();math.setName("数学");session.save(english);session.save(biology);session.save(math);Undergraduatezhangsan=newUndergraduate();zhangsan.setName("zhangsan");Undergraduatelisi=newUndergraduate();lisi.setName("lisi");
zhangsan.getCourseList().add(english);zhangsan.getCourseList().add(math);
lisi.getCourseList().add(biology);lisi.getCourseList().add(math);
session.save(zhangsan);
session.save(lisi);}lazy属性lazy属性,延迟加载,即是否立刻查询并加载当前对象关联的对象XxxToYyy的关系中都有,配置方式类似:@OneToMany(fetch=FetchType.LAZY)@OneToMany(fetch=FetchType.EAGER)凡是@xxxToOne,默认都是EAGER凡是@xxxToMany,默认都是LAZYsession关闭后再去加载关联对象,会报抛出LazyInitializationExceptionlazy属性问题演示@Test
public
voidtestLazy1(){Classescls=(Classes)session.get(Classes.class,1);
session.close();
for(Studentstu:cls.getStuList()){System.out.println(stu.getName()+":"+stu.getAge());}}抛出异常lazy属性解决方式一:修改fetch为EAGER@Entitypublic
classClassesextendsBaseEntity{privateStringname;@OneToMany(mappedBy="classes",fetch=FetchType.EAGER)
@OrderBy(value="agedesc")//排序privateList<Student>stuList=newArrayList<>();对于集合属性,fetch为eager之后查询Classes对象时会在同一个sql中leftouterjoinStudent表,不但会影响效率,而且无法通过sql来进行分页了,检索所有结果,然后在内存中分页。所有一对多的关系中,fetch为eager都后都无法“真分页”,切记!lazy属性解决方式二:关闭session之前,读取一次lazy属性,或者调用Hibernate.initialize()方法一次@Testpublic
voidtestLazy1(){Classescls=(Classes)session.get(Classes.class,1);
//以下两种解决方式任选一种即可解决LazyInitializationException问题//System.out.println(cls.getStuList().size());Hibernate.initialize(cls.getStuList());
session.close();
for(Studentstu:cls.getStuList()){System.out.println(stu.getName()+":"+stu.getAge());
}}集合属性默认fetch为lazy,最好不要修改为eager,这里的两种解决方式才是最好的cascade属性cascade属性,级联操作,指的是操作当前实体对象时,关联对象是否执行同步操作,例如:Classes对象删除时,相关联的Student是否同时全部删除例如:@OneToMany(cascade={CascadeType.PERSIST,CascadeType.R
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国铸造总体行业运行现状及发展前景预测报告
- 2025-2030年中国铀矿市场发展状况及投资前景规划研究报告
- 2025-2030年中国苗圃产业市场供需分析及投资风险研究报告
- 2025-2030年中国纺织机械制造产业十三五规划及投资战略研究报告
- 个人物品质押借款合同书
- 消防工程维保服务合同
- 专业摄影师版权保护与素材管理合同
- 汽车配件采购合同
- 钢筋购销的合同(19篇)
- 2025年供货联盟合同
- 2023-2024学年高中信息技术必修一沪科版(2019)第三单元项目六《 解决温标转换问题-认识程序和程序设计语言》教学设计
- 【湘教版】2024-2025学年七年级数学下册教学工作计划(及进度表)
- 《急性左心衰》课件
- 二零二五版洗煤厂与矿业公司合作洗煤业务合同3篇
- 上海市第一至十八届高一物理基础知识竞赛试题及答案
- 2024李娜一建管理讲义修订版
- 2024院感培训课件
- 2024-2030年中国税务师事务所行业管理模式及投资前景展望报告版
- 护理试讲考核15分钟
- 2024预防流感课件完整版
- 2025天猫服饰春夏趋势白皮书
评论
0/150
提交评论