小记java中的SSH

Sping是用来将javabean或其他的java类与源代码更好的分开的。

说的通俗一点,就是使用XML的形式,完成动态在程序中创建java对象,也叫控制反转,是一种设计模式。

这种根据类名(字符串)生成对象的方式叫做“反射”,MFC中也有。反射的编程方式可以让对象在需要时在动态生成,在if()生成对象1;else 生成对象2;的情景下很有前途。

之所以叫做控制反转,是从下面的场景抽象出来的:

在一个程序中,实例A需要调用实例B中的方法,我们称之为“A依赖于B”。

在A依赖B的情况下,传统的系统中由A来负责创建B,再使用它;

而在Spring的容器中,B将由Spring创建,再交给A使用。

这就叫控制反转。

交给A的时候,B需要将自身的一些值传递给A,这个传递的过程叫“依赖注入”。

注入的方式有两种:

1、调用A中的构造函数,构造注入;

2、调用A中setXX系列函数,赋值注入。

两者在不同的情景下给有好处,又是设计模式。。。

总体来说,如果对象实例A要使用对象实例B,这种依赖关系可以用XML描述,通过Spring容器,让A在生成时就得到要用的B。

显而易见的场景是,每个表单要对应代表着数据库的javabean。


而在hibernate中,如何设计数据库表之间的关系一直困扰着我。今日小结如下:

举例:

如一个描述了学生与班级关系的数据库,特点是每个学生只属于一个班级。

那么,在使用hibernate描述的时候,有如下的方式:

1、学生只属于一个班级,因此是1对1单向的关系;

2、班级包含很多学生,因此是1对多的单向关系;

3、多个学生属于一个班级,因此是多对一单向关系(判断给出的所有学生是否都属于某班级);

用哪个呢?

首先,这里的两种说法隐藏着一个前提,如1,一定是开发者想要从学生获得其班级信息时才会如此描述;2自然是开发者需要查找一个班级所有的学生才会这样说。

于是,确定关系的第一步必然是:确定我想要干什么?

其次,在代码级别,1,2的实现方式有相当的区别,这就又回到了在Spring中说到的依赖。

确定了我想要1还是2之后,依赖关系也就确定了。

如我想要实现1的功能,当然希望生成学生的实例时,hibernate帮我也生成一个相应的班级实例,并交给学生实例使用,这样岂不方便?

这样hibernate的实现岂不和Spring一样了?个人认为确实如此,不过hibernate专注于数据库,而Spring什么都能管,因此hibernate总有些相较于Spring特化的部分:

第三,专注于数据库表,专注于一对一单向,一对多单向,多对一单向,多对多单向(要是在大学,一个学生可以参加不同的班);一对一双向,一对多双向,多对一双向,多对多双向;

值得注意的是,在单向条件下,被强调的是“对”之前的那个对象,该对象被生成时,将被hibernate“顺便”注入‘对’后面那个对象;对于双向,则没有这个问题。

于是单向的关系,在‘对’后面的那个对象生成时,没有额外的信息从hibernate那里获得,也就无法通过该对象执行与关系相关的操作。

这就又回到了“确定我想要干什么”这个问题上来。

像绕口令一样。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值