hibernate总结_hibernate详细总结

2020-02-28 其他工作总结 下载本文

hibernate总结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“hibernate详细总结”。

1、JPA是接口(是一套标准),hibernate是其实现

2、@Entity 表示这个类是实体类(javaBean)

3、@Id 表示主键(javaBean)

4、这样写在配置文件中要书写映射这和xml

配置时不一样,不用resouse了,也不用写映射文件了;

但在测试时要用Configuration config = new AnnotationConfiguration(); 其他的都一样了注:加入annotationjia包 :hibernate annotation jar包---ejb3 persistence jar包---

hibernate-common-annotations.jar包 ★在文档中没提到hibernate-common-annotations.jar包

5、若打@符号不提示可修改:windows--properties--搜索content--java--Editor--Content Aist然后改动右下的Auto-Activation中的选项;第一个表示提示的时间,越短表示提示的越快,;第二个表示在java类中是以 “.”号触发的;第三项表示以@来触发javadoc的;你需要把点三项的@改动到第二项中就可以了,想快点提示,把第一项的时间该小点;

6、常见的O/R Mapping Freamworks :hibernate / jdo/toplink/ibatis7、JPA他是O/R Mapping Freamworks框架的接口,像hibenate等框架实现这个接口;类比JDBC和实现它的众多数据库的驱动

8、hiberante可以把你建好的表自动生成类(通过逆向工程)

当然也可以通过你建好的类帮你自动生成对应的表;

到底是先类还是先表????

解答: 纯理论是先建类后见表, 你的类建好后可以夸数据库建表,因为我们是面向对象编程,所有的起点都应该是面向对象,从面向对象开始,所以说纯理论是先类后表;

实际中先表后类要比先类后表的多,因为第一、没有hibernate时人们都习惯先表后类,这个习惯不好改了; 第二、建好数据库表后往往要对数据库表进行优化,比如说建索引、建中间表、建视图、建各种各样的优化,若用hibernate自动生成,针对数据库优化的这些内容hibernate是没法帮你生成的9、通过转换,引入log4j的配置文件输出日志信息,想把日志信息输出到配置文件中,改动一下配置文件就行了(log4j.properties);

★ :注解写在get方法上

★ 注解放在get方法上还是放在成员变量上?

解答:应该放在get方法上,若放在成员变量上实际上破坏了java面向对象的封装性,因为成员变量定义成private权限就是不让直接访问的,如果把注解放在其上,hibernate就可以直接去访问你私有的成员变量(java反射访问私有变量),甚至去修改你的私有成员变量

10、ID的自动生成策略解答?(重点AUTO)

解答:若在id的get方法上只标注@GeneratedValue相当于用了AUTO,会根据你连得数据库帮你用哪种生成id的方式;如果你连的是oracle会用sequence,但他建的序列名字是固定的名字~~HIBERNATE_SEQUENCE;

11、TableGenerator(表生成器),他适用于任何一种数据库,如你想让你的数据库跨平台、连数据也跨平台,表生成器是一个好的选择; 若用AUTO跨平台,以个缺点是若用的是

sequence,其序列名字是固定的~~~hibernate-sequence;

12、联合主键:如果有几列联合做主键,其设计模式是,构建一个主键类并实现Serializable

接口,重写equals()方法和hashCode()方法,并有其get/set方法;然后在bena类中构

建一个主键类属性即可;

Serializable接口作用:把当前类的对象序列化的序列化的作用:可以把一个对像直接写到硬盘上,也可以直接从硬盘上读取对像,还可以通过网

络把对象传到对方那去,或者对方把序列化得东西直接传给我;

为什么要实现Serializable接口?

解答:Annotation项目中,对于Woman类,若在内存中有多个Woman类对象,而每个Woman

类对象里都有个WomanPK(主键类)类对像,如果内存满了,要用虚拟内存,就是把硬盘上的一

部分空间作为内存来使用,这就需要把一部分Woman对象暂时先传到硬盘上去,此时就需要用到

序列化了;

为什么要重写equals()方法?

解答:用来保证唯一性的; 我们不仅要在数据库中保证唯一性,还要在内存中保证唯一性,在数据库中通过主键来保证的,类比在内存中的对象也要通过主键类对像来保证其唯一性,达到与

数据库同步,所以在这种情况下应该重写equals和hashCode;所以说既然用了联合主键,就

应该重写equals和hashCode方法,而且他的逻辑还不能乱用,不能用父类里面的equals,两个同样的对象就视为同一个对象;

为什么要重写hashCode()方法

解答:要查哈希表中的内容是否相等时首先从hashCode查起;最简单的哈希表可看作是一

个表格或数组,里面有好多位置,每个位置放的是哈希值相同的对象,所以里面往往装的是一个

链表;例如有两个类A、B,他们的哈希值都是1,他们就会被放在哈希表中的同一个位置,若要

查询哈希标中某个类和哈希表中的那个类相同,首先要计算出这个类的哈希值,通过计算出的哈

希值直接定位到与这个哈希值相等的位置,然后循环遍历出这个哈希值里面的对象,找出与哈希

标中对象相同的对象;注:存放Woman对象时,计算对象里面的主键类对象的哈希码值(不是

计算对象的哈希码值),然后存入哈希表中;

13、从数据库中取一个对象的方法:get();和 load();二者区别?

解答:当用seion.get()去拿一个对象的时候,他马上发出sql语句,从数据库中取

出对象的值来把它装到对象中去(此时对象中已有值了),不会产生延迟;

若用load()方法去拿对象时,load生成的是一个代理对象(他并没有对象的属性值),他

并没有真正的发出sql语句从数据库中取出数据,sql语句其实是在你需要拿那个对象的属性

是才发出的,当然从数据库中拿属性时肯定需要seion对象,若seion关闭会报错;

若用get或load取数据时,数据库中没有那条数据,get会报错,load不会,因为没有

用对象的属性,load就不会马上发送sql语句,也就不会去连数据库;

☆ 判断一个对象是代理对象还是普通对象?

解答:打印对象所在的类名; 如t对象System.out.println(t.cla);

接受代理对象的类是实际类的子类;(拿属性时要调用类中方法,代理类又没有)

14、update()方法总结及注意事项?(注:★update方法会在commit时才发update语句)

解答:第一:用来更新detached状态的对象,更新完成后对象转为persistent状态;

第二:更新transisent状态的对象会报错;

第三:更新自己手动设定id的transisent对象可以(前提是数据库中有对应的记录)

第四:处于persistent状态的对象若被改变,若跟原来(和缓存中的比较)的值不相同就会发

sql语句,发sql语句时会把所有字段都更新,若跟原来的值相同就不会发送sql语句;

第五:若在xml中设置成动态更新,没变的值是不会更新的,(他是把改过的值和在内存中对应的对象进行比较,若值相同就不把这个字段夹在sql语句中,反之夹在sql语句中; 若对象

在内存中不存在,会把所有字段都更新,即发送所有字段)(跨seion)

若想跨seion也想知更新改过的字段,用merge(s对象)方法(他会先从数据库把对

应的对象取出,然后比较在发update语句)

只更新部分字段建议用HQL(EJBQL)语句,面向对象的语句;

15、saveOrUpdate()方法,没id时肯定执行save,有id且做了属性改变执行update方

法;

16、clear()方法:不管是get方法还是用load方法取对象都是先从缓存中查找(一级缓

存),如果缓存中没有才会从数据库中查找,调用clear方法会强制清空seion缓存;

17、flush()方法:强制进行从内存到数据库同步;在什么时候flush是受FlushMode控

制,这可以设置,在seion对象刚建立时设置什么时候flush;

18、SchemaExport类:用于在程序中生成建表语句;

关系映射(重点)

1、关系映射指的是对象之间的关系,并不是指数据库之间的关系;(数据库中表之间只有主

外建关系)《分单向和双向,其数据库是一样的》

2、一对一关系(单向关联:丈夫表对应的bean类中有妻子表bean对象属性,妻子表中没

有丈夫表bean对象):

a)、一对一单向外键关联(丈夫表中多出一个id,它是引用妻子表中的id值,也就是

说妻子表中id存在,丈夫表中的那个id值才能存在: emp和dept):

Annation::@OneToOne @JoinColumn

b)、一对一单向主键关联(不重要丈夫表和 妻子表中都多出一id,并且都是引用对方

表的id值):xml

c)、一对一单向 双主键 关联(丈夫表中有两个字段做主键《双主键》去引用妻子表 中

id值):此时的bean需要实现serialzable接口,还得重写hasCode()和

equals()方法;

3、一对一关系(双向关联:丈夫表和妻子表都有对方法的bena对象):

a)一对一双向外键关联:@OneToOne(mappedBy 对方那里是主导)

xml

b)一对一双向主键关联:

4、组件映射:还拿妻子和丈夫来说—在数据库中妻子和丈夫做成一张表,妻子是丈夫表的一部

分,但在写bean时还是丈夫bean和妻子bean,但此时妻子bean中就没有id了,丈夫表中还有妻子bean对象引用,用Annotation配置是在丈夫bean中的妻子引用上

加上@Embedded就可以了;在访问时通过丈夫对象和妻子对象来访问;

5、多对一的数据库设计一般是:在多方加外键;

多对一 单向关联:在类中的映射,在多的那个bean类中加上单个bean的类的属性就行

用Annotation配置 :在加的那个bean属性上配置:@ManyToOne就行了;

多对一双向关联:和平时练习的一样,一个bean属性一个Set集合属性;

此时Annotation配置是:在多里@ManyToOne单个里

@OneToMany(mappedBy=”group”)

6、一对多单向关联:数据库的设计和多对一的是一样的;

一对多的单向关联:在类中的映射,在单个bean类中加上多个bean的类的set集合属性就

行了;

用Annotation配置:在加的那个bean属性上配置:

@OneToMany 和 @JoinColumn(name=”多bean类中的外键名”)

一对多 和多对一的双向关联:单的加对方set集合属性,多的一方加对方bean属性;

7、多对多的单向关联: 首先数据库的一般设计是: 建一个中间表,中间表有两个id分别引

用两个对象的id值,并且两id做主键(双主键),多对多的单向关联:只在一方间立对方的set集合,xml配置也只配有集合的一方;

多对多双向关联(少用):个在自己bena中加上对方set集合属性;

配置是:

8、cascade=“all”----可以取的值:all(所有操作的级联)、persist(保存

时级联)、remove(删除时级联),其他两个不常用:----刷新和合并;

《除了all,其他的只有在调用其对应的方法时才级联;》

Eg:存A关联到B,而B又关联到C,此时就可以在A的xml中用于映射对象的的标签加上

cascade属性,在B也中加上就行了;它不是必须的,也可以先存储C--在存储B—在存储A;

《有关联就可以用它,不管是那种关联,一对一还是多对

一、或一对多 都行;》

铁律:双向关系在程序中要设定双向关联;

9、fetch(抓取):用于从数据库中读取数据时能够级联读取;

它有两个值:eager《渴望的》表示立即加载== 和 lazy《懒惰的》表示延迟加载,不用不加载,用时才加载数据;

取一不要多《lazy》取多要一《eager》

cascade用于级联增、删、改fetch用于 查 级联;

注意:

1、上面说的cascade管增、删、改,fetch管 查的解释:其实cascade对增、删、改、查都是级联的,只不过是在查询时分为立即加载和延迟加载,你若用立即加载,不

管你用不用都会同时把所关联的数据提取出来放入内存中,若用延迟加载,只有等到你

用到所关联的对象时,才会从数据库中把数据提取出来;

2、若用的是延迟加载:只有你用到被关联的数据时才会从数据库中提取出来,此时必须在seion关闭之前操作,因为它是用seion从数据库中提取数据的;

而立即加载会在你从数据库提取数据(当前数据)时把所关联的数据一块取出放入内存

中,若你在读取这部分关联的操作,在seion关闭前后都可以,它是从内存中

取的;10、11、更新数据:

第一种:先把要更新的数据get()或load()出来,然后对其赋予你想的值,commitxml中:inverse=”true” 《set的属性》;表示关联关系在对方那里设定,取我不用拿对方,取对方必须拿我;

后会帮你更改;这种方式会发送两条update语句,第一条更改user 第二改group 第二种:用update方法更新数据: update方法用于更新托管状态的对象,即:脱离

seion管理的对象,先get()出来,然后关闭seion,对get出来的对象从新赋值,然后在得到另一个seion,在用update更新数据,==关闭seion;

12、删除对象:先把要删除的对象get出来,然后把关联关系设为null,在调用delete()方法,如不设为null,会把二者有关联的数据全删除掉;

注解:删除u1会关联到group1,然而删group2又会关联到u2,所有若不打破关联关系

会把所有相互关联的数据全部删除掉;u.setGroup(null);打破关联关系;

另一种方式是:用hql语句删除对象,实际中此方法用的多;

13、查询语句:

===、缓存问题: 分为- 一级缓存、二级缓存、查询缓存(三级缓存)

一级缓存:称为seion级别的缓存, 每个seion都有各自的缓存;

二级缓存:可称为seionFactory级别的缓存;seion会先从二级缓存中查找所需

数据,找不到才发送sel语句从数据库中提取所需数据;

若想用eh二级缓存,首先在habernate.cfg.xml中打开二级缓存,然后到habernate的文档去找到eh的xml文件,拷贝到项目中,和habernate.cfg.xml同级别;project—etc适合放二级缓存的数据:

1、经常被访问

2、不会被经常改动

3、数据量不大;

实际中,不到万不得已一般是不会考虑二级缓存;

《hibernate总结.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
hibernate总结
点击下载文档
相关专题 hibernate详细总结 Hibernate hibernate详细总结 Hibernate
[其他工作总结]相关推荐
    [其他工作总结]热门文章
      下载全文