Hibernate 学习笔记

1.HelloWorld

cfg.xml配置文件,copy  改mysql,name password 、MySQLDirlect等。创建数据库和表,创建与表名同名的类,和对应的id name(配置文件,将实体类映射到数据库中的表  hbm.xml)  创建测试类,config session,getTransaction,commit。

MySQL图形化管理工具 Navicat for MySQL     hbm2ddl  update create

先建表再建类   powerdesigner

log4j日志环境   slf4j-log4f.api    log4j.properties

Junit环境  添加junit  jar包   新建source folder装测试用的代码(跟maven学的)   加@test

sessionFactory每次建立耗费时间,使用单例模式,建立辅助类,静态单例

Junit也可以用@beforeClass注解  @afterClass 来close

@column   字段名和属性名不一样、  @Table    @Transient 透明人  @Temporal 时间精度  @Enumeration

xml方式生成ID:

①手动生成

②ID标签加 @Generator class=""           native最常用,交给数据库自动识别(increament、identity、sequence)

还可以使用annotation @ID下面加@GeneratedValue          @TableGenerator   表生成器,数据库可以跨平台,数据也能跨平台(区别去Aotu,不同平台生成数据不一样)

联合主键   ,建类  Serializable,序列号  做集群时候,宕机转移数据、虚拟内存。      annotation:@EmbeddedID

Hibernate核心开发接口(重点)

Configration,主要目的是产生SessionFactory,SessionFactory目标是为了产生Session  openSession不管何时都会创建一个新Session(需要手动close),getCurrentSession如果有,会拿来用。(自动关闭)如果Commit,Session关闭,对象消失(界定事务边界)

例如在数据库日志的保存过程中,Log的保存(insert into)要和UserDAO的insert into在同一个Transaction里,就需要getCurrentSession.

事务:依赖于数据库的Connection事务(只针对于一个数据库),还有是JTA事务(分布式) 由applicationServer提供,Tomcat不具备功能,需结合spring

JTA:Java Transaction Api                JPA:Java Persistence Api

SAVE的三种状态:a)transient:内存中有一个对象,没ID,缓存中也没有

                               b)persistent:内存中有,缓存有,数据库有(ID)

                               c)detached:内存中有,缓存中没有,数据库有(ID)

 

关系映射(重点)

重中之重:简化问题:怎么写annotation,怎么写增删改查CRUD、一对多、多对一、多对多

一对一:@oneToOne     PowerDesigner连接JDBC,要在环境变量里设置一个CLASSPATH,变量值为mysql jar文件  @JoinColumn 指定外键名     @mappedBy(双向关联必设  对方那里是主导)

联合主键:@IdClass (可以不写 ,联合的上面加@ID)  组件映射:一个类其中的一个属性指向了另外一个对象 @Embedded

多对一单向关联:多的一方加外键,小心 person name(冗余)   类似dream里加属于某人 才是正确的 @ManyToOne

一对多单向关联:@OneToMany 默认当成多对多的一种特殊情况对待,要加一个@JoinColumn,不然会创建 一张中间表 ;Set

一对多 多对一双向单向:多对一、一对多的结合。@OneToMany加mappedBy 

多对多单向:老师和学生,加一张中间表  @ManyToMany 改生成中间表的名字@JoinTable

@JoinTable(name="t_s" ,

joinColumns={@JoinColumn(name="teacher_id")} ,     //指定中间表的属性名

inverseJoinColumns={@JoinColunmn(name="student_id") } )             //对方那张表外键的ID

多对多双向(相当少用):

在关联关系中写CRUD:  双向关系在程序中要设定双向关联

多对多双向:  cascade={}产生级联 ALL  PERSIST  REMOVE   多的一方容易操作

继承映射???

fetchType默认eager 可以改成lazy 

多对一设eager 一对多设lazy;eager是全部取出来,lazy是到用的时候采取(设置用户权限的时候用)  树状结构  缓存,也用lazy

JPA编程接口
如果想消除关联关系,先设定关系为null,再删除对应记录,如果不删记录,
该记录就会变成垃圾数据
树状映射:在同一类中使用One2Many和Many2One

student_course_score设计:①实体类(表)②导航(编程方便)  ③确立编程方式

NativeSQL>HQL>EJBQL>QBC(query by criteria)>QBE(query by example)

EJBQL是HQL的一个子集:Query q = session.createQuery("from Category");   //类名

                                            List categories = (List)q.list();

返回值是query,可以使用链式编程

分页:oracle:三层select嵌套、mysql:limit      hibernate:q.setMaxResult(4);  q.setFirstResult(2);

QL应该和导航关系结合,共同为查询提供服务

VO/DTO Value Object /Date Transfer Object用来传值得对象。例如在登录过程中,有个username 有个password p1、p2,可以用一个VO把这几个东西装起来,然后交给后台处理,验证P1 P2是否相等,再把它转成user对象,再存入DB

exists比in的执行效率高,用exists

QBC:  面向对象的写法而不是QL语言   Criteria

Restrictions.gt("id",2)   greater than id>2

性能优化:

1、注意session.clear()的运用      Java的内存泄漏:语法级别没有,但是连接、连接池的关闭,文件的关闭

2、1+N:fetchType

3、list和iterate    list全部都拿,iterate只拿id

4、一级缓存、二级缓存和查询缓存(面试题):

一级缓存:session级别

二级缓存:sessionFactory级别,可以跨越session存在;经常被访问、改动不大 不会经常改动、数量有限(例如:用户的权限)@cache        load默认使用二级缓存、iterate默认使用二级缓存。   查询缓存:只有在查询重复的时候才用,依赖于二级缓存

缓存算法:LRU、LFU、FIFO  (纯应付面试)

Least Recently Used       Least Frequently Used     First In First Out

 

事务的并发处理(面试意义大于实际工作意义)

一、事务的四个特性:ACID(谁要问这就是酸到家了)

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

脏读 dirty read(读了别的事务没有提交的数据,脏数据)、不可重复读(同一个事务里对同一个数据前后读两次结果不一样,被另一个事务影响)、幻读 (在读的过程中,另外一个事务往里查了一条新数据,影响了结果)

隔离机制,解决并发,设置隔离级别,每种数据库不一样。 readcommitted 2级会出现non repitable问题,所以使用乐观/悲观锁

乐观锁,悲观锁。悲观锁使用数据库的锁,乐观锁使用版本

你可能感兴趣的:(笔记,知识点总结)