Log4j日志环境与JUnit测试环境的搭建
本章讲解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-dropcreate:在在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.propertieslog4j.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,进行测试控制台输出如下,可以看到里面包含了删除表,创建表的语句4,搭建JUnit测试环境需要 junit4.7.zip引入jar文件:junit4.7junit-4.7.jar建立与src同级的目录test,并设置为测试目录,用于存放测试代码
测试: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(); }}
错误记录注释掉org.jacq.hibernate.model.Event类的getId方法的@Id注解,再执行出异常:org.hibernate.AnnotationException: No identifier specified for entity
5,控制台SQL打印方式因为在hibernate.cfg.xml配置文件中配置了所以保存数据时控制台输入语句添加了 format_sql 配置:格式化输出语句输出
页:
[1]