﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-天生我才-文章分类-Hibernate</title><link>http://www.blogjava.net/oscar-1981/category/3555.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:48:38 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:48:38 GMT</pubDate><ttl>60</ttl><item><title>Weblogic上配置Hibernate为JNDI</title><link>http://www.blogjava.net/oscar-1981/articles/29887.html</link><dc:creator>天生我才</dc:creator><author>天生我才</author><pubDate>Wed, 08 Feb 2006 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/oscar-1981/articles/29887.html</guid><wfw:comment>http://www.blogjava.net/oscar-1981/comments/29887.html</wfw:comment><comments>http://www.blogjava.net/oscar-1981/articles/29887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oscar-1981/comments/commentRss/29887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oscar-1981/services/trackbacks/29887.html</trackback:ping><description><![CDATA[<DIV class=text1 id=art_text>
<P>　　一、首先需要把Hibernate 用到的jar包和配置文件都放到Weblogic能够搜索到的CLASSPATH路径上。单单这一步就有很多人很迷茫，其实去仔细看看Weblogic的启动脚本文件startWeblogic.cmd和startWLS.cmd，我想大部分人都知道该怎么配置了。 <BR><BR>　　我机器上的有个Hibernate的项目，在D: estoracle目录下，该目录下的结构是： <BR><BR>　　D: estoraclelib 放置hibernate的所有jar包 <BR>　　D: estoraclesrc 放置源代码 <BR>　　D: estoracleclasses 编译好的代码和hibernate的配置文件(hibernate.properties, log4j.properties, cache.ccf) <BR><BR>　　现在需要把D: estoraclelib目录下那些jar文件和D: estoracleclasses目录都放置到Weblogic的 CLASSPATH里面去，所以修改mydomain里面的Weblogic启动脚本startWeblogic.cmd，在启动Weblogic之前，插入设置CLASSPATH的命令，如下： <BR><BR>　　@rem set hibernate classpath <BR>　　set HIBERNATE_LIB=D: estoraclelib <BR>　　set HIBERNATE_CLASSES=D: estoracleclasses <BR>　　set CLASSPATH=%CLASSPATH%;%HIBERNATE_LIB%cglib-asm.jar;%HIBERNATE_LIB%commons-beanutils.jar; <BR>　　%HIBERNATE_LIB%commons-collections.jar;%HIBERNATE_LIB%commons-lang.jar; <BR>　　%HIBERNATE_LIB%commons-logging.jar;%HIBERNATE_LIB%dom4j-full.jar; <BR>　　%HIBERNATE_LIB%hibernate2.jar;%HIBERNATE_LIB%jcs.jar; <BR>　　%HIBERNATE_LIB%log4j-1.2.8.jar;%HIBERNATE_LIB%odmg.jar; <BR>　　%HIBERNATE_LIB%jta.jar;%HIBERNATE_CLASSES%; <BR><BR>　　下面一行，就是本来脚本里面的启动命令： <BR><BR>　　@rem Call Weblogic Server <BR>　　call "C:eaweblogic700serverinstartWLS.cmd" <BR><BR>　　二、在Weblogic上配置 Oracle数据库的连接池，这一步本来和Hibernate无关，但是如果你想要使用EJB，想要使用JTA，那么必须使用Weblogic提供的连接池，而不能使用Hibernate自带的连接池，或者其它第三方连接池，否则容器将无法管理数据库事务。这一步很简单，就是在Weblogic Console里面配置Connection Pool和TxData Source，我的TxDataSource取名称为“mypool” <BR><BR>　　三、修改hibernate.properties。使用Weblogic的连接池，而不是自带的连接池。我修改的是D: estoracleclasseshibernate.properties，增加如下行： <BR><BR>　　hibernate.dialect net.sf.hibernate.dialect.OracleDialect <BR>　　hibernate.connection.datasource mypool <BR>　　hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider <BR>　　hibernate.session_factory_name hibernate.session_factory <BR><BR>　　注意最后一行，这是使用 Hibernate来绑定JNDI给JNDI起的名称，本来应该是hibernate/session_factory，但是Weblogic要求改为. 号，不过在程序中lookup的时候还是要写hibernate/session_factory <BR><BR>　　另外提到一点的是 <BR><BR>　　hibernate.jdbc.fetch_size 50 <BR>　　hibernate.jdbc.batch_size 25 <BR><BR>　　分别对数据库查询和插入有很大的性能影响，调节这两个选项可以得到最好的性能。 <BR><BR>　　为了保证SessionFactory实例的预创建，使用Weblogic的T3StartUpDef接口创建一个StartUp类，在Weblogic启动的时候运行： <BR><BR>　　package com.javaeye; <BR><BR>　　import java.util.Hashtable; <BR>　　import weblogic.common.T3StartupDef; <BR>　　import weblogic.common.T3ServicesDef; <BR>　　import net.sf.hibernate.cfg.Configuration; <BR>　　import net.sf.hibernate.SessionFactory; <BR><BR>　　public class HibernateStartUp implements T3StartupDef { <BR><BR>　　public void setServices(T3ServicesDef services) {} <BR><BR>　　public String startup(String name, Hashtable args) throws Exception { <BR>　　SessionFactory sf = new Configuration().configure().buildSessionFactory(); <BR>　　return "Hibernate Startup completed successfully"; <BR>　　} <BR>　　} <BR><BR>　　代码非常简单，其实就是确保预先运行 <BR><BR>　　SessionFactory sf = new Configuration().configure().buildSessionFactory(); <BR><BR>　　把sf创建出来，而Hibernate会自行调用一系列类方法，把sf绑定到Weblogic的的JNDI树下的hibernate/session_factory路径中。 <BR><BR>　　4、编译HibernateStartUp.java <BR><BR>　　编译这个源代码的时候需要注意的是，要把weblogic.jar包和Hibernate所有的相关包和配置文件导入。我是把这个源代码放到D: estoraclesrc目录下的，用早已编写好的ant脚本运行一下就编译好了，并且编译好的 class文件被放置到D: estoracleclasses目录下，该目录已经被加入到Weblogic的CLASSPATH里面，因此很省事。 <BR><BR>　　五、配置StartUp类 <BR><BR>　　启动Weblogic，打开Console控制台，在左边的Applet树上找到StartUp &amp; Shutdown，然后在右边点击“Configure a new Startup Class...”，在Name框里面随便填写，在ClassName里面填写你编写的StartUp类，我填写的是 com.javaeye.HibernateStartUp，然后点击“Apply”。然后切换到Target这选项卡，在Target-Server左边的 Avaiable框里面选择“myserver”，点击右箭头，把它挪到右边的“Chosen”框里面去，最后再点击一下“Apply"按钮。如果此时 Weblogic的DOS窗口里面没有出错信息，那么应该已经配置成功了。 <BR><BR>　　六、现在关闭Weblogic，再重新运行 startWelogic.cmd，启动Weblogic，观察DOS窗口的输出信息，可以看到Hibernate的初始化信息一屏屏的滚动输出，证明已经配置成功。现在再打开Console控制台，点击左边Applet树中的Servers|myserver，然后可以在右边最下面找到“View JNDI tree ”，点击它，会打开一个浏览器窗口，显示JNDI树，这时你可以看到一个名称为hibernate的JNDI对象，在左边的Applet树中点击它，看右边的详细信息，我的机器上的信息如下： <BR><BR>　　Bind Name: hibernate <BR>　　Object Class: net.sf.hibernate.impl.SessionFactoryImpl <BR>　　Object Hash Code: 454492 <BR>　　Object To String: net.sf.hibernate.impl.SessionFactoryImpl@6ef5c <BR><BR>　　完全正确！ <BR><BR>　　最后你可以随意在EJB或者Servlet/JSP里面使用JND查找来获得SessionFactory了。 <BR><BR>　　例如： <BR><BR>　　Context ctx = new InitialContext(); <BR>　　SessionFactory sf = (SessionFactory) ctx.lookup("hibernate/session_factory"); <BR><BR>　　请注意：上述代码只能在WebLogic容器内运行，而不能在WebLogic容器外运行。因为SessionFactory并没有实现序列化接口，因此当客户端程序(在另一个单独的JVM中运行)远程访问WebLogic JNDI，企图将SessionFactory序列化到本地，肯定会失败。但即使SessionFactory实现序列化接口，由于它不是一个可以支持RMI的对象，仍然无法在WebLogic容器外正常调用。 <BR><BR>　　与此不同的是，WebLogic本身的DataSource，EJB，JMS等等都是支持RMI的(前提条件是WebLogic相应的jar要有)，所以你可以在WebLogic外面lookup，并且使用它。</P></DIV><img src ="http://www.blogjava.net/oscar-1981/aggbug/29887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oscar-1981/" target="_blank">天生我才</a> 2006-02-08 09:31 <a href="http://www.blogjava.net/oscar-1981/articles/29887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中映射一对多关联</title><link>http://www.blogjava.net/oscar-1981/articles/14145.html</link><dc:creator>天生我才</dc:creator><author>天生我才</author><pubDate>Mon, 26 Sep 2005 13:24:00 GMT</pubDate><guid>http://www.blogjava.net/oscar-1981/articles/14145.html</guid><wfw:comment>http://www.blogjava.net/oscar-1981/comments/14145.html</wfw:comment><comments>http://www.blogjava.net/oscar-1981/articles/14145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oscar-1981/comments/commentRss/14145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oscar-1981/services/trackbacks/14145.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp; 在域模型中,类与类之间最普遍的关系就是关联关系.以客户(Customer)和订单(Order)的关系为例,一个客户能发出多个订单,而一个订单只属于一个客户.从Order到Customer的关联是多对一关联,每个Order对象都会引用一个Customer对象,因此在Order类中应该定义一个Customer类型的属性.<BR>&nbsp;&nbsp;&nbsp; 从Customer到Order是一对多关联,意味着每个Customer对象都会引用一组Order对象,因此在Customer类中应该定义一个集合类型的属性,来引用所有Order对象.<BR>&nbsp;&nbsp;&nbsp; <BR>多对一的单向关联关系:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.hbm.xml<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;hibernate-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;class name="Customer"&nbsp; table="CUSTOMERS"&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;…………<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/hibernate-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; order.hbm.xml<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;hibernate-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;class name="Order"&nbsp; table="ORDER"&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;…………<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff1493>&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="customer" column="CUSTOMER_ID" class="Customer" not-null="true"/&gt;<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/hibernate-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>级联保存和更新<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在&lt;many-to-one&gt;中加入cascade="save-update" 默认为none&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR><BR>一对多的双向关联关系，从内存中读取比数据库中快，所有针对大量的根据客户查询订单的操作，需要使用双向。<BR>&nbsp;<BR>&nbsp;customer.hbm.xml<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;hibernate-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;class name="Customer"&nbsp; table="CUSTOMERS"&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;…………<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;set name="orders" cascade="save-update"<FONT color=#ff1493> inverse="true"</FONT>&gt;&nbsp;&nbsp;&nbsp;&nbsp; //根据Orders变化来同步两张表<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key column="CUSTOMER_ID"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//cascade="true"级联删除，删除了客户信息，订单也自动删除<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one -to-many class="Order"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/hibernate-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; order.hbm.xml<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;hibernate-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;class name="Order"&nbsp; table="ORDER"&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;…………<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff1493>&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="customer" column="CUSTOMER_ID" class="Customer" not-null="true"/&gt;<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/hibernate-mapping&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P><img src ="http://www.blogjava.net/oscar-1981/aggbug/14145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oscar-1981/" target="_blank">天生我才</a> 2005-09-26 21:24 <a href="http://www.blogjava.net/oscar-1981/articles/14145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j使用示例</title><link>http://www.blogjava.net/oscar-1981/articles/14139.html</link><dc:creator>天生我才</dc:creator><author>天生我才</author><pubDate>Mon, 26 Sep 2005 11:37:00 GMT</pubDate><guid>http://www.blogjava.net/oscar-1981/articles/14139.html</guid><wfw:comment>http://www.blogjava.net/oscar-1981/comments/14139.html</wfw:comment><comments>http://www.blogjava.net/oscar-1981/articles/14139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oscar-1981/comments/commentRss/14139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oscar-1981/services/trackbacks/14139.html</trackback:ping><description><![CDATA[<FONT face=Arial><FONT style="BACKGROUND-COLOR: #ffffff" color=#ff1493>PART 1 介绍<BR></FONT>log4j的好处在于：<BR>1.通过修改配置文件，就可以决定log信息输出到何处(console,文件,...),是否输出。<BR>这样，在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(System.out.println(...)等)。<BR>2.使用log4j，需要整个系统有一个统一的log机制，有利于系统的规划。<BR><BR>log4j的使用本身很简单。但合理地规划一个系统的统一log机制需要周全的考虑。<BR><BR>其他关于log4j的信息参看log4j自带的文档。<BR><BR><FONT color=#ff1493>PART II 配置文件详细解释</FONT><BR>先看一个配置文件的例子:<BR>1.配置文件的例子<BR>log4j.rootLogger=DEBUG<BR>#将DAO层log记录到DAOLog,allLog中<BR>log4j.logger.DAO=DEBUG,A2,A4<BR>#将逻辑层log记录到BusinessLog,allLog中<BR>log4j.logger.Businesslog=DEBUG,A3,A4<BR>#A1--打印到屏幕上<BR>log4j.appender.A1=org.apache.log4j.ConsoleAppender<BR>log4j.appender.A1.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A1.layout.ConversionPattern=%-5p [%t] %37c %3x - %m%n<BR>#A2--打印到文件DAOLog中--专门为DAO层服务<BR>log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<BR>log4j.appender.A2.file=DAOLog<BR>log4j.appender.A2.DatePattern='.'yyyy-MM-dd<BR>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<BR><BR>#A3--打印到文件BusinessLog中--专门记录逻辑处理层服务log信息<BR>log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender<BR>log4j.appender.A3.file=BusinessLog<BR>log4j.appender.A3.DatePattern='.'yyyy-MM-dd<BR>log4j.appender.A3.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A3.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<BR><BR>#A4--打印到文件alllog中--记录所有log信息<BR>log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender<BR>log4j.appender.A4.file=alllog<BR>log4j.appender.A4.DatePattern='.'yyyy-MM-dd<BR>log4j.appender.A4.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<BR><BR><BR>2.Appender的使用<BR>一个Appender代表log信息要写向的一个地方。log4j可使用的Appender有很多类型,这里只考虑3种:ConsoleAppender,FileAppender,DailyRollFileAppender<BR>2.1 ConsoleAppender<BR>如果使用ConsoleAppender，那么log信息将写到Console。就是直接把信息打印到System.out上了。<BR>2.2 FileAppender<BR>使用FileAppender，那么log信息将写到指定的文件中。这应该是比较经常使用到的情况。<BR>相应地，在配置文件中应该指定log输出的文件名。如下配置指定了log文件名为demo.txt<BR>log4j.appender.A2.File=demo.txt<BR>注意将A2替换为具体配置中Appender的别名。<BR>2.3 DailyRollingAppender<BR>使用FileAppender可以将log信息输出到文件中，但是如果文件太大了读起来就不方便了。这时就可以使用DailyRollingAppender。DailyRollingAppender可以把Log信息输出到按照日期来区分的文件中。如下配置文件就会每天产生一个log文件，每个log文件只记录当天的log信息：<BR><BR>log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<BR>log4j.appender.A2.file=demo<BR>log4j.appender.A2.DatePattern='.'yyyy-MM-dd<BR>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A2.layout.ConversionPattern=%m%n<BR><BR>3.Layout的配置<BR>Layout指定了log信息输出的样式。<BR>详细信息请查看PatternLayout的javadoc。<BR>例子1：显示日期和log信息<BR>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n<BR>打印的信息是：<BR>2002-11-12 11:49:42,866 SELECT * FROM Role WHERE 1=1 order by createDate desc<BR><BR>例子2：显示日期，log发生地方和log信息<BR>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %l "#" %m%n<BR>2002-11-12 11:51:46,313 cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409) "#" SELECT * FROM Role WHERE 1=1 order by createDate desc <BR><BR>例子3：显示log级别,时间,调用方法,log信息<BR>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<BR>log信息:<BR>[DEBUG] 2002-11-12 12:00:57,376 method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409)<BR>SELECT * FROM Role WHERE 1=1 order by createDate desc <BR><BR><FONT color=#ff1493>PART 3 log4j的使用<BR></FONT>log4j使用步骤有3个：<BR>3.1.根据配置文件初始化log4j<BR>配置文件如PART 2所叙述。现在讲的是如何在程序中配置log4j。<BR>log4j可以使用3中配置器来初始化：BasicConfigurator,DOMConfigurator,PropertyConfigurator<BR>这里用的是PropertyConfigurator。使用PropertyConfigurator适用于所有的系统。<BR>如下的语句<BR>PropertyConfigurator.configure("log4j.properties");<BR>就以log4j.properties为配置文件初始化好了log4j环境。<BR>注意一点：这个语句只需要在系统启动的时候执行一次。例如:在unet webOA项目中可以这么用:<BR>在ActionServlet的init()方法中调用一次。<BR>public class ActionServlet extends HttpServlet{<BR>...<BR>/**<BR>* Initialize global variables<BR>*/<BR>public void init() throws ServletException {<BR>// 初始化Action资源<BR>try{<BR>initLog4j();<BR>...<BR>}catch(IOException e){<BR>throw new ServletException("Load ActionRes is Error");<BR>}<BR>}<BR>...<BR>protected void initLog4j(){<BR>PropertyConfigurator.configure("log4j.properties");<BR>}<BR>...<BR>}//end class ActionServlet<BR><BR>3.2 在需要使用log4j的地方获取Logger实例<BR>如下是RoleDAO类中的使用例子:<BR>static Logger log = Logger.getLogger("DAO");<BR>注意这里使用"DAO"标识符，那么对应的在配置文件中对应的配置信息如下：<BR><BR>#定义DAO Logger<BR>log4j.logger.DAO=DEBUG,A2<BR>#设置Appender A2的属性<BR>log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<BR>log4j.appender.A2.file=demo<BR>log4j.appender.A2.DatePattern='.'yyyy-MM-dd<BR>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A2.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n<BR><BR>public class RoleDAO extends BaseDBObject<BR>{<BR>...<BR>static Logger log = Logger.getLogger("DAO");<BR>...<BR>public BeanCollection selectAll() throws SQLException<BR>{<BR>StringBuffer sql = new StringBuffer(SQLBUF_LEN);<BR>sql.append("SELECT * FROM " + tableName + " order by roldId");<BR>//System.out.println(sql.toString());<BR>log.debug(sql);<BR>...<BR>}<BR>...<BR>}<BR><BR>3.3 使用Logger对象的debug,info,fatal...方法<BR>log.debug("it is the debug info");<BR><BR>附件1：log4j的一个bug<BR>当这样使用时，DailyRollingFileAppender不能正确使用：<BR>public Class RoleDAO(){<BR><BR>static Logger log = Logger.getLogger("DAO");<BR><BR>//在每一次new RoleDAO对象的时候都执行一次configure()操作<BR>public RoleDAO(TransactionManager transMgr) throws SQLException<BR>{<BR>...<BR>PropertyConfigurator.configure("log4j.properties");<BR>...<BR>}<BR><BR>public void select(){<BR>...<BR>//使用log4j进行log记录<BR>log.debug("...");<BR>...<BR>}<BR>}<BR>怎么解决:<BR>在系统启动时执行一次PropertyConfigurator.configure("log4j.properties");<BR>之后就不再执行。 </FONT><BR><img src ="http://www.blogjava.net/oscar-1981/aggbug/14139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oscar-1981/" target="_blank">天生我才</a> 2005-09-26 19:37 <a href="http://www.blogjava.net/oscar-1981/articles/14139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的主键释疑</title><link>http://www.blogjava.net/oscar-1981/articles/13560.html</link><dc:creator>天生我才</dc:creator><author>天生我才</author><pubDate>Tue, 20 Sep 2005 12:15:00 GMT</pubDate><guid>http://www.blogjava.net/oscar-1981/articles/13560.html</guid><wfw:comment>http://www.blogjava.net/oscar-1981/comments/13560.html</wfw:comment><comments>http://www.blogjava.net/oscar-1981/articles/13560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oscar-1981/comments/commentRss/13560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oscar-1981/services/trackbacks/13560.html</trackback:ping><description><![CDATA[hibernate的配置文件<id>字段是必备的，刚刚看的时候一直疑惑，id字段是怎么和数据库表关联的，为什么一定得给表一个额外的字段？<BR><BR>其实，java语言按内存地址来识别或区分一个类的不同对象，而关系数据库按主键值来区分同一个表的不同记录，hibernate使用对象标识符（OID）来建立内存中的对象和数据库表中记录的对应关系，为保证OID的唯一性，应让hibernate而不是应用程序为其赋值。<BR><BR>作为主键的字段必须不为空，不允许重复，主键值永不改变。可以使用具有业务含义的字段作为主键，如COSTOMERS表中的name，但需要满足上述条件，称为自然主键；也有一种代理主键，不具备业务含义，一般取名为ID。ID通常为整数类型，可以定义成自动增长的标识符类型（increment，sequence）。<BR><BR>讲到这里，还得提一下java语言按内存地址区分不同对象，也就是＝＝和equals( )，<BR><BR>    Customer c1＝new Customer("oscar");<BR>    Customer c2＝new Customer("oscar");<BR>   <BR>   c1= =c2           返回false<BR>   c1.equals(c2)   返回true<BR><BR>现在我们回过头来再看下Hibernate的OID<BR><BR>        Transaction tx=session.beginTranscation();<BR>        Customer c1=(Customer) session.load(Customer.class, new long(1));<BR>        Customer c2=(Customer) session.load(Customer.class, new long(1));<BR>        Customer c3=(Customer) session.load(Customer.class, new long(3));<BR>        System.out.println(c1= =c2);<BR>        System.out.println(c1= =c3);<BR><BR>(1)第一次加载OID为1的对象时，是先从数据库中查询ID为1的记录，再创建相应的Customer实例，保存在Session缓存中，最后把这个对象的引用赋值给变量c1。<BR>(2)第二次加载OID为1时，直接把缓存中的Customer对象赋值给c2。<BR>(3)第三持加载OID为3的对象，由于缓存中不存在，必须再次从数据库读取，然后将Customer实例赋值给c3。<BR><BR>因而输出，true          <BR>                    false<BR><BR>最后提一下Hibernate的内置标识符生成器，increment递增，identity,由底层数据库负责ID，sequence，也是由底层数据库负责，hilo, 按high/low的算法来生成，native，能自动判断底层数据库提供的生成标识符的机制。<BR><BR><img src ="http://www.blogjava.net/oscar-1981/aggbug/13560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oscar-1981/" target="_blank">天生我才</a> 2005-09-20 20:15 <a href="http://www.blogjava.net/oscar-1981/articles/13560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>