1 hibernate
概念:
它是O/R Mapping框架(对象关系映射框架)与之类型的框架有JPA,Mybatis框架。它提供丰富的查询(HQL查询,SQL查询,离线查询,命名查询(与mybatis类似,将查询语句写在实体类映射文件中))和对表的操作。
JDBC和Hibernate区别
相同点:1 都是操作数据库的中间件
2 操作的对象都不是线程安全
3 都要进行显示事务处理
不同点: 1 操作语言不同,JDBC只能写纯sql,Hibernate可以是HQL或者是SQL
2 操作的语句对象不同,JDBC操作的是表和表字段,Hibernate的HQL操作的实体类和其属性
3 操作的对象状态不同,jdbc基本都是瞬时状态的数据,hibernate操作的数据对象可以瞬时,持久和游离中的一种。
Hibernate对象三种状态以及如何切换?
瞬时:一般指new出来的数据,数据库没有数据与之相对应
持久:数据库有数据与之相对应,且当前的session没有关闭,如果修改了这个对象的值就有可能影响数据库表中的值
游离(脱管):数据库有数据与之相对应,但是当前session已经关闭。
瞬时转持久?------》调用save(瞬时对象)或者saveorupdate(瞬时对象)方法
持久转瞬时?-----》调用delete(持久对象)
持久转游离?----》调用session.close()或者session.clear()方法
游离转持久?---》sessionFactory.openSession()方法
不能直接将瞬时转游离状态。
Hibernate中session的get方法和load方法的区别?
1 当查询不到数据时,get会返回null,load会抛出异常
2 get方法获取的数据都是真实数据(包括外键对象都是真实数据),load方法获取的数据如果有外键对象,那么该对象就是代理对象(代理对象默认是没有数据,如果向让代理对象获取数据,可以通过Hibernate.initialize(代理对象)方法)。
Hibernate主键生成策略
1 native 本地化,根据当前配置数据库的类型做出适应的匹配
2 increment 添加记录前,查询当前表最大id值,再+1后作为这条添加的记录的id
3 sequence 适用于不支持主键自增,但是支持序列自增的数据库(oracle,DB2)
4 identity 适用于支持主键自增,比如mysql,sqlServer ,sqlite
5 assigned 字符串类型的主键,需要程序员自己添加。
6 uuid.hex 按照算法生成的128位逻辑主键,该主键在当前世界是唯一。
Hibernate级联和懒加载
级联:与增删改。如果需要通过修改一张表的数据影响另一张表的数据,建议使用级联。使用级联要注意删除时候,有可能会误删掉外键关联的其他数据,删除之前是否使用级联要慎重。
懒加载:与查询数据有关。希望通过查询一个实体数据时,取出对应的实体外键对象的数据,应该配置