`
Qieqie
  • 浏览: 340961 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一对多关系的一次有趣实践

阅读更多
不好给本贴取名,暂且看吧。

类A 和 类B 具有一对多的关系。A有子类 A1 和 A2,且A1和A2的字段个数和种类相差较大。
系统对A的检索/查找要求较低,对B的检索/查找功能较多也较重要。

表设计如下:
A采用TABLE_PER_CLASS的方式,即A1和A2各一张表TABLE_A1, TABLE_A2
(系统不会有同时列出A1和A2的查询,也可以容忍A1和A2可重复一个ID)
类B映射为一个表TABLE_B,并设置了一个外键A_ID,关联对B的关系。

OK!现在如何让系统知道A_ID对应的是TABLE_A1,还是TABLE_A2?

习惯从数据库角度看问题的,可以这样解决:
在TABLE_B中增加一个字段type,当type="A1"时,外键A_ID代表关联到TABLE_A1表。当="A2"时,外键A_ID代表关联到TABLE_A2表。
(其它方式的,比如规定A1主键和A2主键进行规则区分等等方案暂不考虑)

如何在Hibernate配置这种关系?翻了Hibernate的参考手册可没直接这方面的资料。

好在B在现实中也确实存在分类的问题,那就这样吧:


 

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class B {
	// ...省略主键以及其他属性的

	protected A a;

	@Entity
	@DiscriminatorValue(value = "A1")	
	public static class B1 extends B {
		@Override
		@ManyToOne(fetch = FetchType.LAZY)
		@JoinColumn(name = "A_ID")
		public A1 getA() {
			return (A1) a;
		}
	}

	@Entity
	@DiscriminatorValue(value = "A2")	
	public static class B2 extends B {
		@Override
		@ManyToOne(fetch = FetchType.LAZY)
		@JoinColumn(name = "A_ID")
		public A2 getA() {
			return (A2) a;
		}
	}

	//这里需要配置Transient,子类需override本方法负责具体映射
	@Transient
	public A getA() {
		return a;
	}

	public void setA(A a) {
		this.a = a;
	}
}


配置文件大概是这样的(关键是要把B$B1, B$B2, A1, A2列进去,而A基本可以不列进去):

<mapping class="com.yourapp.domain.B" />
<mapping class="com.yourapp.domain.B$B1" />
<mapping class="com.yourapp.domain.B$B2" />
<mapping class="com.yourapp.domain.A1" />
<mapping class="com.yourapp.domain.A2" />


经实践,这种方式用起来很顺畅,能够通过以下测试(测试期间一个事务保持Sesison不会被关闭):

B b1 = bDao.loadById(某实际是B.B1类的纪录ID);
assertEquals(B.B1.class, b1.getClass());

B b2 = bDao.loadById(某实际是B.B2类的纪录ID);
assertEquals(B.B2.class, b2.getClass());

A a1 = b1.getA();
assertNotEquals(A1.class, a1.getClass());//Lazy的缘故导致不等
assertTrue(a1 instanceof A1);

A a2 = b2.getA();
assertNotEquals(A2.class, a2.getClass());
assertTrue(a2 instanceof A2);
分享到:
评论

相关推荐

    大班美术活动:有趣的房子.doc

    【大班美术活动:有趣的房子】就是这样一次精心设计的教育活动,它以孩子们喜爱的小动物为出发点,通过有趣的房子设计,让孩子们在创意无限的实践中学会关爱自然,同时提升自身的各项能力。 活动的目标直指孩子们多...

    《有趣的折叠》基础练习(1).doc

    这不仅是一次二维到三维的转换实践,更是对学生的几何直觉和空间想象力的考验。在这个过程中,学生需要观察图形的对称性,理解折叠线的位置,分析面之间的连接关系,这对于学生理解立体图形的基本结构至关重要。此外...

    一堂有趣的航模体验课.pdf

    这堂课程的亮点在于它不仅仅是一堂普通的手工课或者科普讲座,而是一次充分调动学生积极性、寓教于乐的实践活动。在“航模教室”的环境中,学生们不仅能够亲手制作出属于自己的航模模型,更是能亲身经历从理论到实践...

    大学生暑假肯德基打工社会实践报告.docx

    每一次的挫折都是我们变得更强的契机,每一次的成功都是对自己能力的肯定。 总的来说,这次在肯德基的暑假实践是一段难忘的经历,它让我在实践中增强了自己的办事能力和人际交往能力,懂得了金钱的来之不易,明白了...

    一年级数学下册 有趣的图形拼组 2课件 西师大版 课件.ppt

    在小学数学的学习过程中,图形拼组是一个非常有趣且富有挑战性的环节,特别是在一年级下册的课程中。这个阶段的学生开始接触更多的...这种寓教于乐的教学方式,对于一年级的孩子来说,无疑是一次充满乐趣的学习旅程。

    幼儿园中班科学详案教案《有趣的小火箭》含反思.docx

    近期,我参与了一次针对幼儿园中班孩子的科学活动,主题为“有趣的小火箭”。通过这次活动,我深刻体会到游戏化教学的魔力,以及如何有效地将科学原理融入到孩子的日常学习中。 活动开始之前,我们做好了充分的准备...

    《应用一元一次方程——追赶小明》导学案[归纳].pdf

    今天,我们将探讨如何运用一元一次方程来解决一个生动有趣的问题——“追赶小明”。 在开始前,我们首先要明确行程问题中的基本关系式:路程=速度×时间。这一关系式是解决所有行程问题的基石,无论问题多么复杂,...

    一次函数及正比例函数教学设计.doc

    综上所述,一次函数和正比例函数的教学设计需兼顾理论与实践,注重学生思维能力的培养和数学素养的提升,旨在通过生动有趣的方式,使学生掌握这些基本概念,并能灵活运用到实际问题的解决中去。

    关于23种设计模式的有趣见解

    例如,在一个文字处理程序中,可以使用命令模式来记录用户的每一次操作,从而支持撤销和重做功能。 #### 15. 解释器模式 (Interpreter) 解释器模式是一种行为型设计模式,它定义了一种语言的文法,并建立一个解释...

    大学生暑期社会实践活动总结.doc

    今天,我将分享我的一次珍贵经历——2009年参与的华南师范大学文学院组织的暑期社会实践活动,该活动在潮州饶平师范实验中学展开,历时十天。 在这十天中,我们大学生队伍面临的第一个挑战是策划并执行一系列的文化...

    有趣的发现.doc

    【有趣的发现】这篇课文的实例便是一次成功的融合教学尝试。通过这一教学活动,学生们不仅学习到如何阅读和理解文本,还涉及到了生物学的基本原理,同时培养了探索和观察的科学精神。 本篇课文的背景设定在义务教育...

    数学二元一次方程组鲁教七年级下PPT学习教案.pptx

    在教案中,还应包括对二元一次方程组解的各种情况进行分析,如解的唯一性、无解以及无穷多解的情况。例如,如果两个方程是平行的,那么方程组是无解的;如果两个方程重合,那么方程组有无穷多个解。这些特殊情况对于...

    大班科学《各种有趣的蜡烛》教案.doc

    这不仅仅是一次普通的科学实验,而是一次视觉、触觉和思维能力的综合锻炼,它以蜡烛为载体,引发孩子们对科学的兴趣和好奇心。 活动首先从观察开始。教师为孩子们准备了各种形状和颜色的蜡烛,它们或许是传统的大红...

    大班科学有趣的斜坡.docx

    综合来看,《大班科学:有趣的斜坡》是一次成功的科学教育活动。它以游戏的形式,将科学知识融入到孩子们的日常学习中,不仅让孩子们在乐趣中学习到了科学原理,还提升了他们的观察力、实践能力以及合作精神。这样的...

    实践总结1

    总结来说,本实践是关于如何在Hadoop和Spark环境下实施关联规则算法的一次全面体验,涵盖了从环境准备到算法实现的全过程。通过这次实践,可以深入理解大数据处理的流程,提高解决实际问题的能力,并为后续的项目...

    江苏省扬州市高邮市车逻镇七年级数学下册10.1二元一次方程学案无答案新版苏科版

    通过情景创设的方式,学生将面临具体的篮球比赛积分问题,这不仅让学习变得生动有趣,也加深了对二元一次方程应用的理解。问题探究环节让学生回顾一元一次方程,并引导他们自主定义二元一次方程,通过实践练习不断...

    科学:有趣的植物.doc

    《有趣的植物》作为一次大班科学活动,不仅仅是一次简单的知识传授,它更是一次关于探索自然奥秘、培养科学兴趣、学习科学方法的全面教育实践。 在这次活动中,教师们精心设计了多个教学环节,使孩子们在接触植物、...

    一年级语文下册 有趣的汉字1教学实录 语文S版 教案.doc

    总结来说,《有趣的汉字》这堂课程是一次成功的教育实践。它不仅让学生掌握了汉字的基础知识,更重要的是,它让学生在接触汉字的同时,也领略到了中国传统文化的博大精深。通过这堂课,学生不仅学会了用眼睛去看,用...

    七年级数学下册三元一次方程组解法举例人教PPT课件.pptx

    本课件以“三元一次方程组解法举例”为主题,采用了实例教学的方法,旨在帮助学生在生动有趣的学习环境中掌握解题技巧。 课件中的“纸币问题”是一个与学生日常生活紧密相关的实例。通过设定小明拥有一系列不同面额...

    一次函数的应用教学设计.doc

    一次函数是数学中的基础概念,包括其定义、图象特征以及与方程、不等式的关系。在本节课中,学生将学习如何构建实际问题的函数模型,利用数形结合的思想解决问题。 首先,教学内容分为三大部分:复习一次函数的基本...

Global site tag (gtag.js) - Google Analytics