本章讲解hibernate的Log4j日志环境与JUnit测试环境的搭建 1,概念补充 2,hibernate.hbm2ddl.auto参数使用 3,log4j日志系统配置 4,搭建JUnit测试环境 5,控制台SQL打印方式 1,概念补充 对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping):该技术主要用于实现程序对象到关系数据库数据的映射! hibernate就是一种ORM框架 2,hibernate.hbm2ddl.auto参数使用(请读者自行测试效果)hibernate.cfg.xml 配置文件中配置以下参数的作用 参数 参数取值 validate | update | create | create-drop create:在在SessionFactory创建时,自动检查数据库结构,若配置的实体类在数据库中没有对应的表,则创建表;若有,则删除原先的表,再重新创建(导致数据丢失)。 create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。 update:常用,建立好数据库的前提下,第一次加载hibernate时根据model类自动建立表结构,以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。 要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会建立。 validate :每次加载hibernate时,验证数据库表结构是否与映射的实体类相符合。 实体类: package org.jacq.hibernate.model;import javax.persistence.Entity;import javax.persistence.Id;@Entitypublic class Dog { private String name; private int age; public Dog() { } public Dog(String name, int age) { this.name = name; this.age = age; } @Id public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}配置
3,log4j日志系统配置hibernate默认使用slf4j的日志实现方式,我们改为更常用的Log4j日志系统 所需jar文件:apache-log4j-1.2.15.zip 移除Jar文件:slf4j-nop-1.5.8.jar 添加:apache-log4j-1.2.15/log4j-1.2.15.jar 为了使slf4j日志接口与Log4j日志实现关联起来,还需要 slf4j-1.5.8 文件夹下的 slf4j-log4j12-1.5.8.jar 使用Log4j来实现slf4j的接口规范是一种适配器设计模式的使用场景. 添加配置文件log4j.properties到项目src下 可以从 hibernate-distribution-3.3.2.GA 中搜索得到log4j的配置文件log4j.properties log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%nlog4j.rootLogger=warn, stdout#log4j.logger.org.hibernate.test=infolog4j.logger.org.hibernate.tool.hbm2ddl=debug这样hibernate会将创建删除表的SQL语句以及其他很多信息都输出到控制台, 将上述hbm2ddl.auto参数改为create,进行测试 控制台输出如下,可以看到里面包含了删除表,创建表的语句
; u+ O- a5 }' C: {8 C4,搭建JUnit测试环境需要 junit4.7.zip 引入jar文件:junit4.7junit-4.7.jar 建立与src同级的目录test,并设置为测试目录,用于存放测试代码
2 S. z" U! V, O; |1 T9 Q7 I# s
测试: package org.jacq.hibernate.model;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.AnnotationConfiguration;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;import java.util.Date;public class EventTest { private static SessionFactory sessionFactory = null; @BeforeClass public static void beforeClass(){ sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } @Test public void saveEvent(){ Event event = new Event(6L,"hellokitty",new Date()); /** * session可以看做是Connection * */ Session session = sessionFactory.openSession(); session.beginTransaction(); session.save(event); session.getTransaction().commit(); session.close(); } @AfterClass public static void afterClass(){ sessionFactory.close(); }}
, K \! Q6 R0 d" e. B错误记录 注释掉org.jacq.hibernate.model.Event类的getId方法的@Id注解,再执行
出异常:org.hibernate.AnnotationException: No identifier specified for entity
3 t- r/ M$ ~' P _3 c5,控制台SQL打印方式因为在hibernate.cfg.xml配置文件中配置了
所以保存数据时控制台输入语句
添加了 format_sql 配置:格式化输出语句
输出
2 y( P$ b# `: G1 S% S6 `7 d7 M
|