1. Log4j:
a. Logger:表示完成日志信息的处理
b. Appender:设置日志信息去向:可以同时制定多个输出目的地
1. Log4j.appender.appenderName = appenderClass
2. Log4j.appender.appenderName.option1= value1;
3. Log4j.appender.appenderName.option2 = value2
c. Layout:设置日志信息输出样式
1. org.apache.log4j.HTMLLayout
2. org.apache.log4j.SimpleLayout
3. org.apache.log4j.TTCCLayout
4. org.apache.log4j.PatternLayout
a.%p:输出优先级,DEBUG,INFO,ERROR
b.%r:输出程序启动到输出改日志信息花费多少毫秒
c.%t:输出日志的线程名字
d.%f:输出日志信息所属类别的类别名
f.%c:输出日志信息所属类别的全名
g.%d:输入日志的时间或日期
d. 配置文件:log4j.properties(推荐)、log4j.xml
2. Hibernate对象三种状态、openSession/getCurrentSession
a. Transient 瞬时状态
1. New出来的对象,但没有sava都使瞬时状态
2. 持久化对象调用了delete()方法,变成瞬时对象
b. Persist 持久化状态
1. 再数据库中通过get(),load(),find()查询
2. 瞬时对象调用sava()
3. 离线对象调用update()方法
c. Detached 托管状态/游离状态
1.手动构建离线对象
2.持久化对象调用evict(),clear(),close()方法,可变成游离对象
d. openSession/getCurrentSession
1. 使用getCurrentSession再事物提交后,会自动关闭,无需再finally里关闭:使用getCurrentSession需要配置:hibernate.cfg.xml
添加:如果是本地新事物(jdbc事务)
<property name= “hibernate.current_session_context_class”>thread</property>
如果是全局事物(jta事务)
<property name= “hibernate.current_session_context_class”>jta</property>
2.openSession重新建立一个新的session; getCurrentSession使用当前的session
3.getCurrentSession创建的session会和绑定到当前线程,而openSession不会
4.推荐使用getCurrentSession:优点
a.适合web程序,并发管理容易,session由线程产生,且能保证线程总是只有一个session.
b.资源回收变得轻松,session将在commit或rollback后自动释放
c.事务管理十分直观,一般来说在业务层或service层的方法前后用上面的三个语句(获取,处理,提交)包住,就可以让该方法的原子性得到保证
d.有了c,spring AOP对service层进行事务控制就更加简单
e.永远不用在dao方法内做开启,打开,提交,释放session这些事了,不过这可不是什么好习惯
5.拓展:当我们使用updata进行更新时候,为了保证更新,推荐使用session.flush();
3. Hibernate的主键生成策略、SchemaExpert
a. Assigned (常用)
Assigned方式由程序生成主键值,并且要在save之前制定否则会抛出异常,注意:
int auto_increment类型主键除外(<id name=”id” column=”id” type=”int”><generator class=”assigned”/></id>),由数据库自动生成。
<id name=”id” column=”id” type=”string”>
<generator class=”assigned”/>
</id>
b. Hilo
使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼起来作为数据库中的唯一主键,它需要额外的数据库表和字段提供高位值来源,默认使用表:hibernate_unique_key,默认字段叫next_hi,该字段必须有一条记录
特点:需要额外的数据库表支持,能保证同一个数据库中主键的唯一性,但不能保证多个数据库之间主键的唯一性,hilo主键生成由hibernate维护,与底层数据库无关,但不应该手动修改hilo算法使用的表的值,否则引起主键重复的异常
使用:建hi_value表,在对象映射文件里配置:
<id …>
<generator class = “hilo”>
<param name=”table”>hi_value</param>
<param name=”column”>next_hi </param> <!--整形int -->
<param name=”max_lo”>100/param>
</generator>
</id>
c. Increment
对主键值采取自动增长得方式生成新得主键值,但要求底层数据库支持sequence,如oracle,db2,需要在映射文件xxx.hbm.xml中键入increment标志符,
特点:由hibernate本身维护,适用于所有得数据库,不适合多线程并发更新数据库,适合单一进程访问数据库:不能用于群集环境
d. Identity (常用)
根据底层数据库,来支持自动增长,不同数据库用不同得主键增长方式,
特点:与底层数据库有关,适用于mysql, db2, ms sql server,采用数据库生成得主键,用于为long, short , int类型生成唯一标识,使用sql server,和mySQL得自增字段,这个方法不能放到oracle中,oracle不支持自增字段,要设定sequence,identity无须hibernate和用户干涉,使用较方便,但不便于在不同数据库之间移植程序
<generator class = “identity”></generator>id必须是整形的
e. Sequence (常用)
Sequence需要底层数据库支持sequence,例如oracle
特点:需要底层数据库支持序列,有db2, postgresql, oracle, sapdb 等在不同数据库之间移植程序,特别从支持序列的数据库移植到不支持序列的数据库需要修改配置文件
<generator class=”sequence”>
<param name=”sequence”>seq_name</param> <!—seq_name为序列名字-->
</generator>
f. Native (常用推荐)
Native主键生成方式会根据不同的底层数据库自动选择identity, sequence,hilo主键生成方式。
特点:根据不同的底层数据库采用不同的主键生成方式,由于hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到跟多数据库时,可以使用这种方式
g. 此外还有uuid
h. 主键策略的Annotation注解
@Id (默认使用的是native)
@GeneratedValue(strategy=”GenerationType.AUTO”) //指定主键生成策略:自动(常用)
@GenericGenerator(name=”stu_id”,strategy=”uuid”)//比较少用,是hibernate的策略:此时@GeneratedValue(generator=”stu_id”)就不需要指定strategy了
i. SchemaExpert使用:创建数据库脚本
SchemaExport se = new SchemaExport(new AnnotationConfiguration().configure());
se.create(true ,true);
有两个参数,第一个为true就是把ddl语句输出到控制台,第二个true就是根据持久类和映射文件先执行删除再执行创建操作