SSH自学笔记

2、

表示层:struts

业务层:spring采用ioc和aop的思想。

持久层:hibernate采用orm思想。

配置hibernate时,session工厂不用选,还有就是要预先建立mysql数据库连接,

利用datebase逆向工程可以生成实体类,生成映射文件并更新映射文件,idgenerator选择native自增长类型,“下一步”,idgenerator选择native,propertyname填写参数的别名,不该也行,然后,项目下面就会生成一个对应表的实体类,

配置spring时,正常配置就行,不用特别修改。

Hibernate中,一个数据库表逆向生成一个持久化类,每个持久化类对属性的存取方法使用了标准javabean命名约定,同时把类属性的访问级别设为私有。这是推荐的设计,但并不是必须的。

所有的持久化类都要求有无参的构造器,因为hiberate必须使用java反射机制为你创建对象。

Hibernate需要知道怎么去加载和存储持久化类的对象,这正是hibernate映射文件发挥作用的地方。映射文件中的column属性告诉hibernate,我们使用表的哪个字段作为主键,嵌套元素generator指定了标识符生成策略,在这里我们指定native(自增长,主键),assign(手工赋值,主键),foreign(较少使用,此主键又为外键),hibernate强烈建议给每个表加一个自增长的类id只能出现一次,表示主键,column一定是指数据库表列名,property,id指的是实体类属性名。他根据已配置的数据库方言自动选择最佳的标识符生成策略。Property元素的name属性告诉hibernate使用哪个getter和setter方法。

持久化:就是将程序数据在瞬时状态和持久状态之间相互转化。

DAO:DAO是一种模式,业务逻辑和数据访问解耦合。

ORM:对象关系映射,是DAO接口针对关系型数据库的一种实现,本质上就是一个DAO实现类。

Hibernate逆向工程:生成实体类,映射文件,配置文件。

Hibernate的三种状态:临时态(未受管理),持久态,游离态(未受管理)。

临时态:新建;持久态:save,update;游离态:session.clear(),session.close()之后。

临时态和游离态的区别:游离态:数据库中有与之对应的数据。临时态:数据库中不一定有与之对应的数据。

持久态的数据在事务提交时,自动与数据库对应表记录自动匹配,把程序对象值赋给数据库值。

游离态一定是由持久态转化而来的。

13、一对多:从POJO对象看,在一的一方有多的一方的set集合,多的一方有一的一方的实体类。

14、从配置文件看:

多对一:一的一方有<set>节点,其内部有<ont-to-many>节点,多的一方有<many-to-one>的节点。

单项一对多:只在一的一方有多的一方的set集合,多的一方没有一的一方的实体类。

延迟加载:session必须处于打开状态。

Order-by="title",设置根据什么进行排序。一的一方set内多方集合中实体的排序方式。

Cascade:表示是否进行级联操作。

All:对所有操作都进行级联;

None:对所有操作都不进行级联;

Save-update:执行更新操作时级联;

Delete:执行删除时级联操作。

inverse:是“反转”的意思,表示关联关系的控制权,即按照关联的某一方的对象状态来同步更新数据库。为true,表示有对方负责,为false,表示有自己负责。

主键关系的一对一,两种实现:

主键关系的一对一,不允许使用延迟加载,lazy的值都为false。

外键关系的一对一,主键方依然为即时加载,但外键方为延迟加载。

首先配置数据库,子表的主键依赖于父表的主键,父表的主键自动增长,子表的主键非自动增长。然后,逆向生成映射文件,并修改映射文件,在父表java文件中,添加字表的实体类和方法,删除set的相关信息。在主表的映射文件中,删除set的相关信息,在字表的映射文件中,删除many-to-one的相关信息。在主表的映射文件中,添加<one-to-onename="women"class="com.xaygc.Women"/>(其中的women字段对应父表中的子表实体类名称。)然后,在子表的映射文件中,添加<one-to-onename="men"class="com.xaygc.Men"/>(其中的men字段对应子表中父表实体类名称)。然后,修改子表的映射文件:

<generatorclass="foreign">

<paramname="property">men</param>

</generator>

其中的men和下面的one-to-one的表中的name名字是一样的。

外键关系的一对一。

Hibernate的即时加载和延迟加载:

即时加载:不管是否使用,马上从数据库中取出,放入内存。如:session.get()方法。优点:响应速度快,效率高,不需要session一直处于打开状态。缺点:占用资源多。

延迟加载:代码执行后,并不马上执行sql语句从数据库中获取数据,而是在使用对象时才加载,如:session.load()方法。优点:占用资源少。缺点:相应速度慢,需要session一直处于打开状态。

注意:如果使用延迟加载,session要一直处于open状态,否则会报异常。

相关推荐