true--将Hibernate发送给数据库的sql显示出来-->
--实体映射文件-->
3、配置log4j.properties属性文件
(1)配置一个日志系统
Hibernate使用Apachecommons-logging来为各种事件记录日志,commons-logging将直接输出到ApacheLog4j(如果在类路径中包括log4j.jar)或JDK1.4logging(如果运行在JDK1.4或以上的环境下);这允许我们在Log4j和JDK1.4logging之间进行选择。
但多数开发者喜欢Log4j。
(2)配置log4j.properties属性文件
从Hibernate的分发版(它在etc/目录下)拷贝log4j.properties与hibernate.cfg.xml.放在一起。
内容如下:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE}%5p%c{1}:
%L-%m%n
log4j.rootLogger=warn,stdout
log4j.logger.org.hibernate=info
log4j.logger.org.hibernate.type=info
log4j.logger.org.hibernate.tool.hbm2ddl=debug
(3)缺省情况下,只有Hibernate的启动信息会显示在标准输出上
在应用系统运行过程中,可以观察Hibernate的提示内容。
实现对PO类和数据库表之间的映射
1、编写和实现本例中的PO类
(1)添加一个PO类---类名称为Book,包名称为com.px1987.sshwebcrm.dao.pobject;
(2)在该类中增加各个属性,并提供get/set方法
privateStringid;
privateStringbookName;
privatecharbookKind;
privatefloatbookPrice;
(3)最后的代码为下面的状态
packagecom.px1987.sshwebcrm.dao.pobject;
importjava.util.*;
publicclassBook{
privateStringid;
privateStringbookName;
privatecharbookKind;
privatefloatbookPrice;
publicBook(){
}
publicStringgetId()
{
returnid;
}
privatevoidsetId(Stringid)//?
{
this.id=id;
}
publicStringgetBookName()
{
returnbookName;
}
publicvoidsetBookName(StringnewBookName)
{
this.bookName=newBookName;
}
publicchargetBookKind()
{
returnbookKind;
}
publicvoidsetBookKind(charnewBookKind)
{
this.bookKind=newBookKind;
}
publicfloatgetBookPrice()
{
returnbookPrice;
}
publicvoidsetBookPrice(floatnewBookPrice)
{
this.bookPrice=newBookPrice;
}
@Override
publicinthashCode(){
finalintPRIME=31;
intresult=1;
result=PRIME*result+bookKind;
result=PRIME*result+((bookName==null)?
0:
bookName.hashCode());
result=PRIME*result+Float.floatToIntBits(bookPrice);
result=PRIME*result+((id==null)?
0:
id.hashCode());
returnresult;
}
@Override
publicbooleanequals(Objectobj){
if(this==obj)
returntrue;
if(obj==null)
returnfalse;
if(getClass()!
=obj.getClass())
returnfalse;
finalBookother=(Book)obj;
if(bookKind!
=other.bookKind)
returnfalse;
if(bookName==null){
if(other.bookName!
=null)
returnfalse;
}elseif(!
bookName.equals(other.bookName))
returnfalse;
if(Float.floatToIntBits(bookPrice)!
=Float.floatToIntBits(other.bookPrice))
returnfalse;
if(id==null){
if(other.id!
=null)
returnfalse;
}elseif(!
id.equals(other.id))
returnfalse;
returntrue;
}
}
注意:
OOP倡导的是基于setter/getter的方法访问,而非直接访问域。
因此其各个属性设置为private。
而其中的equals和hashCode方法可以采用Eclipse工具自动产生
Hashcode和equals这2个方法都是用来判断2个对象是否相等的,但是他们是有区别的。
equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等了。
简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。
举个例子,有个学生类,属性只有姓名和性别,那么我们可以认为只要姓名和性别相等,那么就说这2个对象是相等的。
hashcode方法一般用户不会去调用,比如在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,而且也用到了equals方法。
这里不可以重复是说equals和hashcode只要有一个不等就可以了!
所以简单来讲,hashcode相当于是一个对象的编码,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比较起来不直观。
我们一般在覆盖equals的同时也要覆盖hashcode,让他们的逻辑一致。
举个例子,还是刚刚的例子,如果姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。
同时还要注意,在PO类中药提供默认的构造方法,否则将会出现下面的错误信息。
2、映射前面的Book数据库表——声明它的映射元数据
(1)映射文件的作用
对象和关系数据库之间的映射通常是用一个XML文档(XMLdocument)来定义的。
这个映射文档被设计为易读的,并且可以手工修改。
映射语言是以Java为中心,这意味着映射文档是按照持久化类的定义来创建的,而非表的定义。
(2)Hibernate采用XML文件来配置对象-关系映射,有以下优点
●Hibernate既不会渗透到上层域模型(业务处理层)中,也不会渗透到下层数据模型(数据库系统)中。
●软件开发人员可以独立设计域模型,不必强迫遵守任何规范。
●数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范。
●对象-关系映射不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便。
注意:
Hibernate没有渗透到域模型中,是指在持久化类中没有引入任何HibernateAPI。
但是对于应用中负责处理业务的过程域对象,当然应该借助HibernateAPI来操纵数据库。
可以直接在Eclipse的项目视图中(3)增加一个Book.hbm.xml文件
(4)映射文件的内容——简化版
xmlversion="1.0"?
>
DOCTYPEhibernate-mapping
PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"
(5)正常版
xmlversion="1.0"?
>
DOCTYPEhibernate-mapping
PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"
(5)该Book.hbm.xml存放的位置
(6)保证在hibernate.cfg.xml文件中添加对Book.hbm.xml的引用定义
编程基于HibernateAPI的DAO组件
1、设计创建SessionFactory对象的HibernateUtil的辅助类
(1)增加一个类,名称为HibernateUtil,包名称为com.px1987.sshwebcrm.dao.util
HibernateUtil这个类帮助我们创建SessionFactory对象、并管理Session。
(2)编程该类
packagecom.px1987.sshwebcrm.dao.util;
importorg.hibernate.*;
importorg.hibernate.cfg.*;
publicclassHibernateUtil{
privatestaticfinalSessionFactorysessionFactory;
/*静态初始器,当JVM(Java虚拟机)加载HibernateUtil类时,会执行该静态代码块。
*/
static{
try{
//创建SessionFactory对象的代码(但不能重复创建)
//sessionFactory=newConfiguration().configure("c:
/xxx/hibernate.cfg.xml").buildSessionFactory();
sessionFactory=newConfiguration().configure().buildSessionFactory();
}
catch(Throwableex){
thrownewExceptionInInitializerError(ex);
}
}
publicstaticfinalThreadLocalthreadLocal=newThreadLocal();
publicstaticSessioncurrentSession(){
SessioncurrentSession=(Session)threadLocal.get();
//OpenanewSession,ifthisThreadhasnoneyet
if(currentSession==null){
currentSession=sessionFactory.openSession();
threadLocal.set(currentSession);
}
returncurrentSession;
}
publicstaticvoidcloseSession(){
SessioncurrentSession=(Session)threadLocal.get();
if(currentSession!
=null)
currentSession.close();
threadLocal.set(null);
}
privatestaticSessionFactorygetSessionFactory()throwsHibernateException{
returnsessionFactory;
}
}
2、设计访问数据库表中的数据的业务组件HibernateDAOBean.java类
(1)添加一个接口HibernateDAOInterface,包名称为com.px1987.sshwebcrm.dao.inter-----我们面向接口编程
(2)在该接口中提供如下的方法定义
packagecom.px1987.sshwebcrm.dao.inter;
importjava.util.ArrayList;
importorg.hibernate.HibernateException;
publicinterfaceHibernateDAOInterface{
publicArrayListdoSelectBookDataFromDB(StringselectHQL)
throwsHibernateException;
publicbooleandoInsertBookDataToDB()
throwsHibernateException,jav