??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久久久久久久久久久久久久久av ,精品国产91乱码一区二区三区四区,精品亚洲一区二区三区http://www.aygfsteel.com/oscar-1981/category/3555.htmlzh-cnFri, 02 Mar 2007 06:48:38 GMTFri, 02 Mar 2007 06:48:38 GMT60Weblogic上配|Hibernate为JNDIhttp://www.aygfsteel.com/oscar-1981/articles/29887.html天生我才天生我才Wed, 08 Feb 2006 01:31:00 GMThttp://www.aygfsteel.com/oscar-1981/articles/29887.htmlhttp://www.aygfsteel.com/oscar-1981/comments/29887.htmlhttp://www.aygfsteel.com/oscar-1981/articles/29887.html#Feedback0http://www.aygfsteel.com/oscar-1981/comments/commentRss/29887.htmlhttp://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>

天生我才 2006-02-08 09:31 发表评论
]]>
Hibernate中映一对多兌http://www.aygfsteel.com/oscar-1981/articles/14145.html天生我才天生我才Mon, 26 Sep 2005 13:24:00 GMThttp://www.aygfsteel.com/oscar-1981/articles/14145.htmlhttp://www.aygfsteel.com/oscar-1981/comments/14145.htmlhttp://www.aygfsteel.com/oscar-1981/articles/14145.html#Feedback0http://www.aygfsteel.com/oscar-1981/comments/commentRss/14145.htmlhttp://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>

        
         



天生我才 2005-09-26 21:24 发表评论
]]>
log4j使用CZhttp://www.aygfsteel.com/oscar-1981/articles/14139.html天生我才天生我才Mon, 26 Sep 2005 11:37:00 GMThttp://www.aygfsteel.com/oscar-1981/articles/14139.htmlhttp://www.aygfsteel.com/oscar-1981/comments/14139.htmlhttp://www.aygfsteel.com/oscar-1981/articles/14139.html#Feedback0http://www.aygfsteel.com/oscar-1981/comments/commentRss/14139.htmlhttp://www.aygfsteel.com/oscar-1981/services/trackbacks/14139.htmlPART 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");
之后׃再执行?


天生我才 2005-09-26 19:37 发表评论
]]>
Hibernate中的主键释疑http://www.aygfsteel.com/oscar-1981/articles/13560.html天生我才天生我才Tue, 20 Sep 2005 12:15:00 GMThttp://www.aygfsteel.com/oscar-1981/articles/13560.htmlhttp://www.aygfsteel.com/oscar-1981/comments/13560.htmlhttp://www.aygfsteel.com/oscar-1981/articles/13560.html#Feedback0http://www.aygfsteel.com/oscar-1981/comments/commentRss/13560.htmlhttp://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>


天生我才 2005-09-20 20:15 发表评论
]]>
վ֩ģ壺 | | | Դ| ·| | | | ҵ| | | | | | ³| ˳| ѷ| ʳ| Ҧ| ˮ| | | | ͤ| | ̨| Զ| ³| | | ڰ| | ˳| | ƽɽ| Ժ| | | ʦ| | |