??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久久久久久久久久久久久久久av
,精品国产91乱码一区二区三区四区,精品亚洲一区二区三区 http://www.aygfsteel.com/oscar-1981/category/3555.htmlzh-cn Fri, 02 Mar 2007 06:48:38 GMT Fri, 02 Mar 2007 06:48:38 GMT 60 Weblogic上配|Hibernate为JNDI http://www.aygfsteel.com/oscar-1981/articles/29887.html天生我才 天生我才 Wed, 08 Feb 2006 01:31:00 GMT http://www.aygfsteel.com/oscar-1981/articles/29887.html http://www.aygfsteel.com/oscar-1981/comments/29887.html http://www.aygfsteel.com/oscar-1981/articles/29887.html#Feedback 0 http://www.aygfsteel.com/oscar-1981/comments/commentRss/29887.html http://www.aygfsteel.com/oscar-1981/services/trackbacks/29887.html
一、首先需要把Hibernate 用到的jar包和配置文g都放到Weblogic能够搜烦到的CLASSPATH路径上。单单这一步就有很多h很迷茫,其实Ml看看Weblogic的启动脚本文件startWeblogic.cmd和startWLS.cmdQ我惛_部分人都知道该怎么配置了? 我机器上的有个Hibernate的项目,在D: estoracle目录下,该目录下的结构是Q? D: estoraclelib 攄hibernate的所有jar? D: estoraclesrc 攄源代? D: estoracleclasses ~译好的代码和hibernate的配|文?hibernate.properties, log4j.properties, cache.ccf) 现在需要把D: estoraclelib目录下那些jar文g和D: estoracleclasses目录都放|到Weblogic?CLASSPATH里面去,所以修改mydomain里面的Weblogic启动脚本startWeblogic.cmdQ在启动Weblogic之前Q插入设|CLASSPATH的命令,如下Q? @rem set hibernate classpath set HIBERNATE_LIB=D: estoraclelib set HIBERNATE_CLASSES=D: estoracleclasses set CLASSPATH=%CLASSPATH%;%HIBERNATE_LIB%cglib-asm.jar;%HIBERNATE_LIB%commons-beanutils.jar; %HIBERNATE_LIB%commons-collections.jar;%HIBERNATE_LIB%commons-lang.jar; %HIBERNATE_LIB%commons-logging.jar;%HIBERNATE_LIB%dom4j-full.jar; %HIBERNATE_LIB%hibernate2.jar;%HIBERNATE_LIB%jcs.jar; %HIBERNATE_LIB%log4j-1.2.8.jar;%HIBERNATE_LIB%odmg.jar; %HIBERNATE_LIB%jta.jar;%HIBERNATE_CLASSES%; 下面一行,是本来脚本里面的启动命令: @rem Call Weblogic Server call "C:eaweblogic700serverinstartWLS.cmd" 二、在Weblogic上配|?Oracle数据库的q接池,q一步本来和Hibernate无关Q但是如果你惌使用EJBQ想要用JTAQ那么必M用Weblogic提供的连接池Q而不能用Hibernate自带的连接池Q或者其它第三方q接池,否则容器无法管理数据库事务。这一步很单,是在Weblogic Console里面配置Connection Pool和TxData SourceQ我的TxDataSource取名UCؓ“mypool? 三、修改hibernate.properties。用Weblogic的连接池Q而不是自带的q接池。我修改的是D: estoracleclasseshibernate.propertiesQ增加如下行Q? hibernate.dialect net.sf.hibernate.dialect.OracleDialect hibernate.connection.datasource mypool hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider hibernate.session_factory_name hibernate.session_factory 注意最后一行,q是使用 Hibernate来绑定JNDIlJNDIL名称Q本来应该是hibernate/session_factoryQ但是Weblogic要求改ؓ. P不过在程序中lookup的时候还是要写hibernate/session_factory 另外提到一点的? hibernate.jdbc.fetch_size 50 hibernate.jdbc.batch_size 25 分别Ҏ据库查询和插入有很大的性能影响Q调节这两个选项可以得到最好的性能? Z保证SessionFactory实例的预创徏Q用Weblogic的T3StartUpDef接口创徏一个StartUpc,在Weblogic启动的时候运行: package com.javaeye; import java.util.Hashtable; import weblogic.common.T3StartupDef; import weblogic.common.T3ServicesDef; import net.sf.hibernate.cfg.Configuration; import net.sf.hibernate.SessionFactory; public class HibernateStartUp implements T3StartupDef { public void setServices(T3ServicesDef services) {} public String startup(String name, Hashtable args) throws Exception { SessionFactory sf = new Configuration().configure().buildSessionFactory(); return "Hibernate Startup completed successfully"; } } 代码非常单,其实是保预先q行 SessionFactory sf = new Configuration().configure().buildSessionFactory(); 把sf创徏出来Q而Hibernate会自行调用一pdcL法,把sfl定到Weblogic的的JNDI树下的hibernate/session_factory路径中? 4、编译HibernateStartUp.java ~译q个源代码的时候需要注意的是,要把weblogic.jar包和Hibernate所有的相关包和配置文g导入。我是把q个源代码放到D: estoraclesrc目录下的Q用早已~写好的ant脚本q行一下就~译好了Qƈ且编译好?class文g被放|到D: estoracleclasses目录下,该目录已l被加入到Weblogic的CLASSPATH里面Q因此很省事? 五、配|StartUpc? 启动WeblogicQ打开Console控制収ͼ在左边的Applet树上扑ֈStartUp & ShutdownQ然后在双点击“Configure a new Startup Class...”,在Name框里面随便填写,在ClassName里面填写你编写的StartUpc,我填写的?com.javaeye.HibernateStartUpQ然后点几ZApply”。然后切换到Targetq选项卡,在Target-Server左边?Avaiable框里面选择“myserver”,点击右箭_把它挪到双的“Chosen”框里面去,最后再点击一下“Apply"按钮。如果此?Weblogic的DOSH口里面没有出错信息Q那么应该已l配|成功了? 六、现在关闭WeblogicQ再重新q行 startWelogic.cmdQ启动WeblogicQ观察DOSH口的输Z息,可以看到Hibernate的初始化信息一屏屏的滚动输出,证明已经配置成功。现在再打开Console控制収ͼ点击左边Applet树中的Servers|myserverQ然后可以在双最下面扑ֈ“View JNDI tree ”,点击它,会打开一个浏览器H口Q显CJNDI树,q时你可以看C个名UCؓhibernate的JNDI对象Q在左边的Applet树中点击它,看右边的详细信息Q我的机器上的信息如下: Bind Name: hibernate Object Class: net.sf.hibernate.impl.SessionFactoryImpl Object Hash Code: 454492 Object To String: net.sf.hibernate.impl.SessionFactoryImpl@6ef5c 完全正确Q? 最后你可以随意在EJB或者Servlet/JSP里面使用JND查找来获得SessionFactory了? 例如Q? Context ctx = new InitialContext(); SessionFactory sf = (SessionFactory) ctx.lookup("hibernate/session_factory"); h意:上述代码只能在WebLogic容器内运行,而不能在WebLogic容器外运行。因为SessionFactoryq没有实现序列化接口Q因此当客户端程?在另一个单独的JVM中运?q程讉KWebLogic JNDIQ企囑ְSessionFactory序列化到本地Q肯定会p|。但即SessionFactory实现序列化接口,׃它不是一个可以支持RMI的对象,仍然无法在WebLogic容器外正常调用? 与此不同的是QWebLogic本n的DataSourceQEJBQJMS{等都是支持RMI?前提条g是WebLogic相应的jar要有)Q所以你可以在WebLogic外面lookupQƈ且用它?/P>
]]> Hibernate中映一对多兌 http://www.aygfsteel.com/oscar-1981/articles/14145.html天生我才 天生我才 Mon, 26 Sep 2005 13:24:00 GMT http://www.aygfsteel.com/oscar-1981/articles/14145.html http://www.aygfsteel.com/oscar-1981/comments/14145.html http://www.aygfsteel.com/oscar-1981/articles/14145.html#Feedback 0 http://www.aygfsteel.com/oscar-1981/comments/commentRss/14145.html http://www.aygfsteel.com/oscar-1981/services/trackbacks/14145.html 在域模型?cMcM间最普遍的关pd是关联关p?以客?Customer)和订?Order)的关pMؓ?一个客戯发出多个订单,而一个订单只属于一个客?从Order到Customer的关联是多对一兌,每个Order对象都会引用一个Customer对象,因此在OrdercM应该定义一个Customercd的属? 从Customer到Order是一对多兌,意味着每个Customer对象都会引用一lOrder对象,因此在CustomercM应该定义一个集合类型的属?来引用所有Order对象. 多对一的单向关联关p? customer.hbm.xml <hibernate-mapping> <class name="Customer" table="CUSTOMERS"> <id> ………?BR> </class> </hibernate-mapping> order.hbm.xml <hibernate-mapping> <class name="Order" table="ORDER"> <id> ………?BR> <many-to-one name="customer" column="CUSTOMER_ID" class="Customer" not-null="true"/> </class> </hibernate-mapping> U联保存和更?BR> ?lt;many-to-one>中加入cascade="save-update" 默认为none 一对多的双向关联关p,从内存中d比数据库中快Q所有针对大量的Ҏ客户查询订单的操作,需要用双向?BR> customer.hbm.xml <hibernate-mapping> <class name="Customer" table="CUSTOMERS"> <id> ………?BR> <set name="orders" cascade="save-update" inverse="true" > //ҎOrders变化来同步两张表 <key column="CUSTOMER_ID"/> //cascade="true"U联删除Q删除了客户信息Q订单也自动删除 <one -to-many class="Order"> </set> </class> </hibernate-mapping> order.hbm.xml <hibernate-mapping> <class name="Order" table="ORDER"> <id> ………?BR> <many-to-one name="customer" column="CUSTOMER_ID" class="Customer" not-null="true"/> </class> </hibernate-mapping>
]]>log4j使用CZ http://www.aygfsteel.com/oscar-1981/articles/14139.html天生我才 天生我才 Mon, 26 Sep 2005 11:37:00 GMT http://www.aygfsteel.com/oscar-1981/articles/14139.html http://www.aygfsteel.com/oscar-1981/comments/14139.html http://www.aygfsteel.com/oscar-1981/articles/14139.html#Feedback 0 http://www.aygfsteel.com/oscar-1981/comments/commentRss/14139.html http://www.aygfsteel.com/oscar-1981/services/trackbacks/14139.html PART 1 介绍 log4j的好处在于: 1.通过修改配置文gQ就可以军_log信息输出C?console,文g,...),是否输出?BR>q样Q在pȝ开发阶D可以打印详l的log信息以跟t系l运行情?而在pȝE_后可以关闭log输出,从而在能跟t系l运行情늚同时,又减了垃圾代码(System.out.println(...){??BR>2.使用log4jQ需要整个系l有一个统一的log机制Q有利于pȝ的规划?BR> log4j的用本w很单。但合理地规划一个系l的l一log机制需要周全的考虑?BR> 其他关于log4j的信息参看log4j自带的文档?BR>PART II 配置文g详细解释 先看一个配|文件的例子: 1.配置文g的例?BR>log4j.rootLogger=DEBUG #DAO层log记录到DAOLog,allLog?BR>log4j.logger.DAO=DEBUG,A2,A4 #逻辑层log记录到BusinessLog,allLog?BR>log4j.logger.Businesslog=DEBUG,A3,A4 #A1--打印到屏q上 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-5p [%t] %37c %3x - %m%n #A2--打印到文件DAOLog?-专门为DAO层服?BR>log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender log4j.appender.A2.file=DAOLog log4j.appender.A2.DatePattern='.'yyyy-MM-dd log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n #A3--打印到文件BusinessLog?-专门记录逻辑处理层服务log信息 log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender log4j.appender.A3.file=BusinessLog log4j.appender.A3.DatePattern='.'yyyy-MM-dd log4j.appender.A3.layout=org.apache.log4j.PatternLayout log4j.appender.A3.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n #A4--打印到文件alllog?-记录所有log信息 log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender log4j.appender.A4.file=alllog log4j.appender.A4.DatePattern='.'yyyy-MM-dd log4j.appender.A4.layout=org.apache.log4j.PatternLayout log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 2.Appender的?BR>一个Appender代表log信息要写向的一个地斏Vlog4j可用的Appender有很多类?q里只考虑3U?ConsoleAppender,FileAppender,DailyRollFileAppender 2.1 ConsoleAppender 如果使用ConsoleAppenderQ那么log信息写到Console。就是直接把信息打印到System.out上了?BR>2.2 FileAppender 使用FileAppenderQ那么log信息写到指定的文g中。这应该是比较经怋用到的情c?BR>相应圎ͼ在配|文件中应该指定log输出的文件名。如下配|指定了log文g名ؓdemo.txt log4j.appender.A2.File=demo.txt 注意A2替换为具体配|中Appender的别名?BR>2.3 DailyRollingAppender 使用FileAppender可以log信息输出到文件中Q但是如果文件太大了读v来就不方便了。这时就可以使用DailyRollingAppender。DailyRollingAppender可以把Log信息输出到按照日期来区分的文件中。如下配|文件就会每天生一个log文gQ每个log文g只记录当天的log信息Q?BR> log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender log4j.appender.A2.file=demo log4j.appender.A2.DatePattern='.'yyyy-MM-dd log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%m%n 3.Layout的配|?BR>Layout指定了log信息输出的样式?BR>详细信息h看PatternLayout的javadoc?BR>例子1Q显C日期和log信息 log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n 打印的信息是Q?BR>2002-11-12 11:49:42,866 SELECT * FROM Role WHERE 1=1 order by createDate desc 例子2Q显C日期,log发生地方和log信息 log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %l "#" %m%n 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 例子3Q显ClogU别,旉,调用Ҏ,log信息 log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n log信息: [DEBUG] 2002-11-12 12:00:57,376 method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409) SELECT * FROM Role WHERE 1=1 order by createDate desc PART 3 log4j的?BR> log4j使用步骤?个: 3.1.Ҏ配置文g初始化log4j 配置文g如PART 2所叙述。现在讲的是如何在程序中配置log4j?BR>log4j可以使用3中配|器来初始化QBasicConfigurator,DOMConfigurator,PropertyConfigurator q里用的是PropertyConfigurator。用PropertyConfigurator适用于所有的pȝ?BR>如下的语?BR>PropertyConfigurator.configure("log4j.properties"); ׃log4j.properties为配|文件初始化好了log4j环境?BR>注意一点:q个语句只需要在pȝ启动的时候执行一ơ。例?在unet webOA目中可以这么用: 在ActionServlet的init()Ҏ中调用一ơ?BR>public class ActionServlet extends HttpServlet{ ... /** * Initialize global variables */ public void init() throws ServletException { // 初始化Action资源 try{ initLog4j(); ... }catch(IOException e){ throw new ServletException("Load ActionRes is Error"); } } ... protected void initLog4j(){ PropertyConfigurator.configure("log4j.properties"); } ... }//end class ActionServlet 3.2 在需要用log4j的地方获取Logger实例 如下是RoleDAOcM的用例? static Logger log = Logger.getLogger("DAO"); 注意q里使用"DAO"标识W,那么对应的在配置文g中对应的配置信息如下Q?BR> #定义DAO Logger log4j.logger.DAO=DEBUG,A2 #讄Appender A2的属?BR>log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender log4j.appender.A2.file=demo log4j.appender.A2.DatePattern='.'yyyy-MM-dd log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n public class RoleDAO extends BaseDBObject { ... static Logger log = Logger.getLogger("DAO"); ... public BeanCollection selectAll() throws SQLException { StringBuffer sql = new StringBuffer(SQLBUF_LEN); sql.append("SELECT * FROM " + tableName + " order by roldId"); //System.out.println(sql.toString()); log.debug(sql); ... } ... } 3.3 使用Logger对象的debug,info,fatal...Ҏ log.debug("it is the debug info"); 附g1Qlog4j的一个bug 当这样用时QDailyRollingFileAppender不能正确使用Q?BR>public Class RoleDAO(){ static Logger log = Logger.getLogger("DAO"); //在每一ơnew RoleDAO对象的时候都执行一ơconfigure()操作 public RoleDAO(TransactionManager transMgr) throws SQLException { ... PropertyConfigurator.configure("log4j.properties"); ... } public void select(){ ... //使用log4jq行log记录 log.debug("..."); ... } } 怎么解决: 在系l启动时执行一ơPropertyConfigurator.configure("log4j.properties"); 之后׃再执行? ]]>Hibernate中的主键释疑 http://www.aygfsteel.com/oscar-1981/articles/13560.html天生我才 天生我才 Tue, 20 Sep 2005 12:15:00 GMT http://www.aygfsteel.com/oscar-1981/articles/13560.html http://www.aygfsteel.com/oscar-1981/comments/13560.html http://www.aygfsteel.com/oscar-1981/articles/13560.html#Feedback 0 http://www.aygfsteel.com/oscar-1981/comments/commentRss/13560.html http://www.aygfsteel.com/oscar-1981/services/trackbacks/13560.html 字段是必备的Q刚刚看的时候一直疑惑,id字段是怎么和数据库表关联的Qؓ什么一定得l表一个额外的字段Q?BR> 其实Qjava语言按内存地址来识别或区分一个类的不同对象,而关pL据库按主键值来区分同一个表的不同记录,hibernate使用对象标识W(OIDQ来建立内存中的对象和数据库表中记录的对应关p,Z证OID的唯一性,应让hibernate而不是应用程序ؓ其赋倹{?BR> 作ؓ主键的字D必M为空Q不允许重复Q主键值永不改变。可以用具有业务含义的字段作ؓ主键Q如COSTOMERS表中的nameQ但需要满上q条ӞUCؓ自然主键Q也有一U代理主键,不具备业务含义,一般取名ؓID。ID通常为整数类型,可以定义成自动增长的标识W类型(incrementQsequenceQ?BR> 讲到q里Q还得提一下java语言按内存地址区分不同对象Q也是Q=和equals( )Q?BR> Customer c1Qnew Customer("oscar"); Customer c2Qnew Customer("oscar"); c1= =c2 q回false c1.equals(c2) q回true 现在我们回过头来再看下Hibernate的OID Transaction tx=session.beginTranscation(); Customer c1=(Customer) session.load(Customer.class, new long(1)); Customer c2=(Customer) session.load(Customer.class, new long(1)); Customer c3=(Customer) session.load(Customer.class, new long(3)); System.out.println(c1= =c2); System.out.println(c1= =c3); (1)W一ơ加载OID?的对象时Q是先从数据库中查询ID?的记录,再创建相应的Customer实例Q保存在Session~存中,最后把q个对象的引用赋值给变量c1?BR>(2)W二ơ加载OID?Ӟ直接把缓存中的Customer对象赋值给c2?BR>(3)W三持加载OID?的对象,׃~存中不存在Q必dơ从数据库读取,然后Customer实例赋值给c3?BR> 因而输出,true false 最后提一下Hibernate的内|标识符生成器,increment递增Qidentity,由底层数据库负责IDQsequenceQ也是由底层数据库负责,hilo, 按high/low的算法来生成QnativeQ能自动判断底层数据库提供的生成标识W的机制?BR> ]]>
վ֩ģ壺
|
|
|
Դ |
· |
|
|
|
ҵ |
|
|
|
|
|
³ |
˳ |
ѷ |
ʳ |
Ҧ |
ˮ |
|
|
|
ͤ |
|
̨ |
Զ |
³ |
书 |
|
ڰ |
|
˳ |
齭 |
ƽɽ |
Ժ |
|
|
ʦ |
|
|