??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成AV人片在线观看,在线观看亚洲AV日韩AV,亚洲欧美日韩综合久久久久http://m.tkk7.com/lifenote/category/27920.html&nbsp; Try to find something different in your life and then write it down&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Java乐园Q?lt;a target='_blank'><font color='red' size="+1">www.java-bj.cn</font></a> 资料下蝲</strong> <div style="float:left"> <script type="text/javascript"><!-- google_ad_client = "pub-4636496036365579"; /* 468x60, 创徏?08-4-23 */ google_ad_slot = "3356926921"; google_ad_width = 468; google_ad_height = 60; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </div> <div style="float:left"> <script type="text/javascript"><!-- google_ad_client = "pub-4636496036365579"; /* 468x60, 创徏?08-4-23 */ google_ad_slot = "5017273295"; google_ad_width = 468; google_ad_height = 60; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </div> <div style="clear:both;"></div>zh-cnThu, 24 Apr 2008 07:51:56 GMTThu, 24 Apr 2008 07:51:56 GMT60Eclipse下的Java反编译插Ӟ(x)Jode Decompilerhttp://m.tkk7.com/lifenote/archive/2008/04/24/195588.htmlLifeNoteLifeNoteThu, 24 Apr 2008 07:05:00 GMThttp://m.tkk7.com/lifenote/archive/2008/04/24/195588.htmlhttp://m.tkk7.com/lifenote/comments/195588.htmlhttp://m.tkk7.com/lifenote/archive/2008/04/24/195588.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/195588.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/195588.html 安装Ҏ(gu)Q?
    help => Software Updates => Find and Install... => Search for new features to install,单击"New Remote Site..." 在URL栏输?http://www.technoetic.com/eclipse/update.然后下一步,可以看?#8220;jode decompiler plugin *.*”Q选上安装可以了(jin)?

安装好后可以看到Window => Preferences... => Java => Jode Decompiler选项卡?

配置QWindow => Preferences... => General => Editors => File Associations扑ֈ"*.class"?Associated editors"里面可以看到"Jode class file viewer"选中它再单击Default按钮.

在Eclipse中展开jar文g,双击class文g卛_看到反编译之后的源代?


LifeNote 2008-04-24 15:05 发表评论
]]>
Java数据库操作基本流E?/title><link>http://m.tkk7.com/lifenote/archive/2008/04/24/195431.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 24 Apr 2008 02:36:00 GMT</pubDate><guid>http://m.tkk7.com/lifenote/archive/2008/04/24/195431.html</guid><wfw:comment>http://m.tkk7.com/lifenote/comments/195431.html</wfw:comment><comments>http://m.tkk7.com/lifenote/archive/2008/04/24/195431.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/lifenote/comments/commentRss/195431.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lifenote/services/trackbacks/195431.html</trackback:ping><description><![CDATA[<div id="qes8ycq" class="NewsContent" id="NewsContentLabel"><span id="c8mmq2a" class="t18"><span id="0ueqmwu" class="a14c" id="zoom"><font face="Times New Roman" size="3">1.Java数据库操作基本流E?br /> a .数据库连?.Drivermanager 链接数据?br /> String className,url,uid,pwd;<br /> className="Oracle.jdbc.driver.OracleDriver";<br /> uid="scott";<br /> pwd="tiger";<br /> url="jdbc:oracle:thin:@localhost:1521:ora92";<br /> Class.forName(classname);<br /> Connection conn=DriverManager.getConnection(url,uid,pwd);<br /> 2.JNDI链接数据?br /> String jndi ="jdbc/db"; //  e20-040 9L0-609 数据源的名称<br /> //context是一l名U到对象的绑定组?br /> Hashtable env=new Hashtable ();<br /> Context ctx=(Context)new InitialContext.lookup("env");// 获得数据源所在的上下文点的对?br /> DataSource ds=(DataSource)ctx.lookup(jndi);//扑ֈ数据?/font> <p class="Ltw305"></p> <p> </p> <font face="Times New Roman" size="3"> <p><br /> Connection conn=ds.getConnection();//<br /> b.执行 sql语句<br /> String sql;<br /> StateMent stat=conn.createStatement();<br /> ResultSet rs=stat.executeQuery(sql);//执行数据的查询语?select);<br /> stat.executeUpdate(sql);//执行数据的更新语?inset into ,delete ,update ,drop)<br /> stat.close();<br /> c.用preparedStatement 来执行sql语句<br /> String sql="inset into table(id,name) values(?,?)";<br /> PreparedStatement ps=conn.prepareStatement(sql);<br /> ps.setInt(1,001);<br /> ps.setString(2,"zhangmanli"); <font color="#ffffff"></font></p> <p>ps.executeQuery();<br /> int count=ps.executeUpdate();<br /> d.处理执行l果<br /> 查询语句Q返回记录集ResultSet对象<br /> 更新语句Q返回数字,表示该更新媄(jing)响的记录?br /> javax.sql.*<br /> javax.naming.*;<br /> 数据处理Q?br /> 1关闭connection 的自动提?br /> conn.setAutoCommit(false);<br /> 2执行一pdsql 语句Q?br /> Statement sm;<br /> sm=conn.createStatement(sql);<br /> sm.executeUpdate();<br /> sm.close(); </p> <p>3.提交Q?<br /> conn.commit();<br /> 4.回滚机制Q?br /> conn.rollback();<br /> e:U程处理Q?br /> DQjndi和dataSource 来获得数据库的链接:(x)<br /> import java.sql.ResultSet ;<br /> import java.sql.*;<br /> import javax.sql.DataSource;<br /> import javax.naming.Context;<br /> import javax.naming.InitialContext;<br /> import java.util.Hashtable;<br /> import java.util.Properties;<br /> import java.io.*;<br /> public class BasicExample{<br />  public static void main(String args[]){<br />   Connection conn=null;<br />   try{<br />    Properties prop =new Properties();<br />    prop.load(new FileInputStream("simple.properties"));<br />    Hashtable env =new Hashtable();<br />    env.put(Context.INITIAL_CONTEXT_FACTORY,prop.getProperty("INITIAL_CONTEXT_FACTORY"));<br />    env.put(Context.PROVIDER_URL,prop.getProperty("PROVIDER_URL"));<br />    InitialContext ctx=new InitialContext(env);<br />   DataSource ds=(DataSource)ctx.lookup("Book"); <p class="Ltw305"></p> <br />    Conn=ds.getConnection();<br />    Statement stat=conn.createStatement();;<br />    ResultSet rs=stmt.executeQuery(sql);<br />    while(rs.next()){<br />     int id=Integer.parseInt(rs.getString("userId"));<br />     String userName=rs.getString ("username");<br /> <br />    }<br />   }catch(SQLException e){<br />    e.printStackTrace();<br />   }finally{<br />    try{<br />     if(conn!=null){<br />      conn.close();<br />     }<br />    }catch(SQLException e){<br />     e.printStackTrace();<br />    }<br />   }<br />  }<br /> }; </font></span></span></div> <img src ="http://m.tkk7.com/lifenote/aggbug/195431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lifenote/" target="_blank">LifeNote</a> 2008-04-24 10:36 <a href="http://m.tkk7.com/lifenote/archive/2008/04/24/195431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中Criteria的完整用?http://m.tkk7.com/lifenote/archive/2008/03/12/185708.htmlLifeNoteLifeNoteWed, 12 Mar 2008 07:24:00 GMThttp://m.tkk7.com/lifenote/archive/2008/03/12/185708.htmlhttp://m.tkk7.com/lifenote/comments/185708.htmlhttp://m.tkk7.com/lifenote/archive/2008/03/12/185708.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/185708.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/185708.html 
设计上可以灵zȝҎ(gu) Criteria 的特Ҏ(gu)方便地进行查询条件的l装。现在对 Hibernate的Criteria 的用法进行ȝQ?/font>
   Hibernate 设计?CriteriaSpecification 作ؓ(f) Criteria 的父接口Q下面提供了(jin) Criteria和DetachedCriteria ?
   Criteria ?DetachedCriteria 的主要区别在于创建的形式不一P Criteria 是在U的Q所

以它是由 Hibernate Session q行创徏的;?DetachedCriteria 是离U的Q创建时无需
SessionQDetachedCriteria 提供?2 个静(rn)态方?forClass(Class) ?forEntityName(Name)
q行DetachedCriteria 实例的创建?Spring 的框架提供了(jin)getHibernateTemplate
().findByCriteria(detachedCriteria) Ҏ(gu)可以很方便地Ҏ(gu)DetachedCriteria 来返回查询结
果?
   Criteria ?DetachedCriteria 均可使用 Criterion ?Projection 讄查询条g。可以设

|?FetchMode( 联合查询抓取的模?) Q设|排序方式。对?Criteria q可以设|?FlushModel
Q冲?Session 的方式)(j)?LockMode Q数据库锁模式)(j)?
下面?Criterion ?Projection q行详细说明?/font>
     Criterion ?Criteria 的查询条件。Criteria 提供?add(Criterion criterion) Ҏ(gu)?/font>
d查询条g?br />      Criterion 接口的主要实现包括:(x) Example ?Junction ?SimpleExpression 。?
Junction 的实际用是它的两个子类 conjunction ?disjunction Q分别是使用 AND ?OR ?/font>
作符q行来联l查询条仉合?br />      Criterion 的实例可以通过 Restrictions 工具cL创徏QRestrictions 提供?jin)大量的静(rn)?/font>
Ҏ(gu)Q如 eq Q等于)(j)?ge Q大于等于)(j)?between {来Ҏ(gu)的创?Criterion 查询条g
QSimpleExpression 实例Q。除此之外, Restrictions q提供了(jin)Ҏ(gu)来创?conjunction ?
disjunction 实例Q通过往该实例的 add(Criteria) Ҏ(gu)来增加查询条件Ş成一个查询条仉?/font>
?br />      至于 Example 的创建有所不同Q?Example 本n提供?jin)一个静(rn)态方?create(Object
entity) Q即Ҏ(gu)一个对象(实际使用中一般是映射到数据库的对象)(j)来创建。然后可以设|一?/font>
qo(h)条gQ?
Example exampleUser =Example.create(u)
.ignoreCase() // 忽略大小?
.enableLike(MatchMode.ANYWHERE);
// ?String cd的属性,无论在那里值在那里都匹配。相当于 %value%

  Project 主要是让 Criteria 能够q行报表查询Qƈ可以实现分组?Project 主要?
SimpleProjection ?ProjectionList ?Property 三个实现。其?SimpleProjection ?
ProjectionList 的实例化是由内徏?Projections 来完成,如提供的 avg ?count ?max ?
min ?sum 可以让开发者很Ҏ(gu)Ҏ(gu)个字D进行统计查询?
       Property 是对某个字段q行查询条g的设|,如通过Porperty.forName(“color”).in

(new String[]{“black”,”red”,”write”}); 则可以创Z?Project 实例。通过
criteria ?add(Project) Ҏ(gu)加入到查询条件中厅R?
    使用 Criteria q行查询Q主要要清晰的是 Hibernate 提供?jin)那些类和方法来满开发中?/font>
询条件的创徏和组装,下面介绍几种用法Q?/font>
1. 创徏一个Criteria 实例
org.hibernate.Criteria接口表示特定持久cȝ一个查询。Session?Criteria实例的工厂?br /> Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
 
2. 限制l果集内?br /> 一个单独的查询条g是org.hibernate.criterion.Criterion 接口的一个实例?/font>

org.hibernate.criterion.Restrictionsc?定义?jin)获得某些内|Criterioncd的工厂方法?br /> List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.between("weight", minWeight, maxWeight) )
    .list();


U束可以按逻辑分组?
 
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.or(
        Restrictions.eq( "age", new Integer(0) ),
        Restrictions.isNull("age")
    ) )
    .list();
 
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
    .add( Restrictions.disjunction()
        .add( Restrictions.isNull("age") )
        .add( Restrictions.eq("age", new Integer(0) ) )
        .add( Restrictions.eq("age", new Integer(1) ) )
        .add( Restrictions.eq("age", new Integer(2) ) )
    ) )
    .list();
 
Hibernate提供?jin)相当多的内|criterioncd(Restrictions 子类), 但是其有用的是可以允许


你直接用SQL?br />  
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",


Hibernate.STRING) )
    .list();
 
{alias}占位W应当被替换查询实体的列别名?
Property实例是获得一个条件的另外一U途径。你可以通过调用Property.forName() 创徏一?/font>

Property?
 
  Property age = Property.forName("age");
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.disjunction()
        .add( age.isNull() )
        .add( age.eq( new Integer(0) ) )
        .add( age.eq( new Integer(1) ) )
        .add( age.eq( new Integer(2) ) )
    ) )
    .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
    .list();
 
3. l果集排?br /> 你可以用org.hibernate.criterion.Order来ؓ(f)查询l果排序?
 
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "F%")
    .addOrder( Order.asc("name") )
    .addOrder( Order.desc("age") )
    .setMaxResults(50)
    .list();
 
List cats = sess.createCriteria(Cat.class)
    .add( Property.forName("name").like("F%") )
    .addOrder( Property.forName("name").asc() )
    .addOrder( Property.forName("age").desc() )
    .setMaxResults(50)
    .list();
 
4. 兌
你可以用createCriteria()非常Ҏ(gu)的在互相兌的实体间建立 U束?br />  
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "F%")
    .createCriteria("kittens")
        .add( Restrictions.like("name", "F%")
    .list();



注意W二?createCriteria()q回一个新?Criteria实例Q该实例引用kittens 集合中的元素?
接下来,替换形态在某些情况下也是很有用的?br />  
List cats = sess.createCriteria(Cat.class)
    .createAlias("kittens", "kt")
    .createAlias("mate", "mt")
    .add( Restrictions.eqProperty("kt.name", "mt.name") )
    .list();



(createAlias()q不创徏一个新?Criteria实例?
Cat实例所保存的之前两ơ查询所q回的kittens集合?没有被条仉qo(h)的。如果你希望只获?/font>

W合条g的kittensQ?你必M用returnMaps()?
 
List cats = sess.createCriteria(Cat.class)
    .createCriteria("kittens", "kt")
    .add( Restrictions.eq("name", "F%") )
    .returnMaps()
    .list();
Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
    Map map = (Map) iter.next();
    Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
    Cat kitten = (Cat) map.get("kt");
}


5. 动态关联抓?br /> 你可以用setFetchMode()在运行时定义动态关联抓取的语义?
 
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .setFetchMode("mate", FetchMode.EAGER)
    .setFetchMode("kittens", FetchMode.EAGER)
    .list();
 
q个查询可以通过外连接抓取mate和kittens?br />  
6. 查询CZ
org.hibernate.criterion.Examplecd怽通过一个给定实?构徏一个条件查询?br />  
Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
    .add( Example.create(cat) )
    .list();



版本属性、标识符和关联被忽略。默认情况下gؓ(f)null的属性将被排除?
可以自行调整Example使之更实用?
 
Example example = Example.create(cat)
    .excludeZeroes()           //exclude zero valued properties
    .excludeProperty("color")  //exclude the property named "color"
    .ignoreCase()              //perform case insensitive string comparisons
    .enableLike();             //use like for string comparisons
List results = session.createCriteria(Cat.class)
    .add(example)
    .list();



甚至可以使用examples在关联对象上攄条g?br />  
List results = session.createCriteria(Cat.class)
    .add( Example.create(cat) )
    .createCriteria("mate")
        .add( Example.create( cat.getMate() ) )
    .list();



7. 投媄(jing)(Projections)、聚合(aggregationQ和分组QgroupingQ?br /> org.hibernate.criterion.Projections?Projection 的实例工厂。我们通过调用


setProjection()应用投媄(jing)C个查询?
 
List results = session.createCriteria(Cat.class)
    .setProjection( Projections.rowCount() )
    .add( Restrictions.eq("color", Color.BLACK) )
    .list();
 
List results = session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount() )
        .add( Projections.avg("weight") )
        .add( Projections.max("weight") )
        .add( Projections.groupProperty("color") )
    )
    .list();




在一个条件查询中没有必要昑ּ的?"group by" 。某些投q型就是被定义?分组投媄(jing)Q他


们也出现在SQL的group by子句中?

可以选择把一个别名指z一个投影,q样可以使投影DU束或排序所引用。下面是两种不同?/font>

实现方式Q?br />  
List results = session.createCriteria(Cat.class)
    .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )
    .addOrder( Order.asc("colr") )
    .list();




List results = session.createCriteria(Cat.class)
    .setProjection( Projections.groupProperty("color").as("colr") )
    .addOrder( Order.asc("colr") )
    .list();
 
alias()和as()Ҏ(gu)便的一个投影实例包装到另外一?别名的Projection实例中。简而言之,


当你d一个投影到一个投影列表中?你可以ؓ(f)它指定一个别名:(x)
 
List results = session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount(), "catCountByColor" )
        .add( Projections.avg("weight"), "avgWeight" )
        .add( Projections.max("weight"), "maxWeight" )
        .add( Projections.groupProperty("color"), "color" )
    )
    .addOrder( Order.desc("catCountByColor") )
    .addOrder( Order.desc("avgWeight") )
    .list();



List results = session.createCriteria(Domestic.class, "cat")
    .createAlias("kittens", "kit")
    .setProjection( Projections.projectionList()
        .add( Projections.property("cat.name"), "catName" )
        .add( Projections.property("kit.name"), "kitName" )
    )
    .addOrder( Order.asc("catName") )
    .addOrder( Order.asc("kitName") )
    .list();



也可以用Property.forName()来表C投影:(x)
 
List results = session.createCriteria(Cat.class)
    .setProjection( Property.forName("name") )
    .add( Property.forName("color").eq(Color.BLACK) )
    .list();

List results = session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount().as("catCountByColor") )
        .add( Property.forName("weight").avg().as("avgWeight") )
        .add( Property.forName("weight").max().as("maxWeight") )
        .add( Property.forName("color").group().as("color" )
    )
    .addOrder( Order.desc("catCountByColor") )
    .addOrder( Order.desc("avgWeight") )
    .list();



8. ȝ(detached)查询和子查询
DetachedCriteriacM你在一个session范围之外创徏一个查询,q且可以使用L?Session?/font>

执行它?br />  
DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
    .add( Property.forName("sex").eq('F') );
//创徏一个Session
Session session = .;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
session.close();



DetachedCriteria也可以用以表C子查询。条件实例包含子查询可以通过 Subqueries或?/font>
Property获得?br />  
DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight").avg() );
session.createCriteria(Cat.class)
    .add( Property.forName("weight).gt(avgWeight) )
    .list();

DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight") );
session.createCriteria(Cat.class)
    .add( Subqueries.geAll("weight", weights) )
    .list();


怺兌的子查询也是有可能的Q?br />  
DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")
    .setProjection( Property.forName("weight").avg() )
    .add( Property.forName("cat2.sex").eqProperty("cat.sex") );
session.createCriteria(Cat.class, "cat")
    .add( Property.forName("weight).gt(avgWeightForSex) )
    .list();



LifeNote 2008-03-12 15:24 发表评论
]]>
深入理解Tapestry的Rewindhttp://m.tkk7.com/lifenote/archive/2008/03/08/184695.htmlLifeNoteLifeNoteSat, 08 Mar 2008 08:03:00 GMThttp://m.tkk7.com/lifenote/archive/2008/03/08/184695.htmlhttp://m.tkk7.com/lifenote/comments/184695.htmlhttp://m.tkk7.com/lifenote/archive/2008/03/08/184695.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/184695.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/184695.html 我们来看一下最单的TextFieldlgQ组件定义如?
Java代码 复制代码
  1. <input  jwcid="price@TextField" type="text" value="ognl:picture.price"  translator="translator:number,pattern=##.##"  validators="validators:min=0" displayName="h" class="input_text"/>  

再看一下TextField中的rewindFormComponentlgҎ(gu)
Java代码 复制代码
  1. protected void rewindFormComponent(IMarkupWriter writer, IRequestCycle cycle) {   
  2.        //从请求中得到参数?  
  3.         String value = cycle.getParameter(getName());   
  4.   
  5.         try {   
  6.              //用translator来{换?  
  7.             Object object = getTranslatedFieldSupport().parse(this, value);   
  8. //用validators来验证?  
  9.             getValidatableFieldSupport().validate(this, writer, cycle, object);   
  10.             //赋值给容器或者页?  
  11.             setValue(object);   
  12.         } catch (ValidatorException e) {   
  13.             getForm().getDelegate().record(e);   
  14.         }   
  15.     }  

可以看到在rewindFormComponent中,主要是从h中取得用戯入的|然后q行处理Q最后赋值给容器或者页面,上面的例子中?x)调用页面类的getPicture().setPrice(“用户输入的?#8221;)来进行赋倹{这h个表单的提交可以理解ؓ(f)所有的表单lgd用户输入的值ƈ赋值给面的过E?
整个表单提交的详l处理过E如下:(x)
    * initialize():面初始?
    * pageBeginRender() ("rewind"):getRequestCycle().isRewinding()为true
    * rewind of the form / setting of properties:所有表单组件调用rewindFormComponent来取D?
    * Deferred listeners (for Submit components):调用Submitlg的listener
    * Form's listenerQ调用Formlg的listener
    * pageEndRender() ("rewind"): getRequestCycle().isRewinding()为true
    * pageBeginRender() (normal): getRequestCycle().isRewinding()为false
    * pageEndRender() (normal): getRequestCycle().isRewinding()为false
我们可以看到pageBeginRender和pageEndRender被调用了(jin)两次Q两ơ中的区别ؓ(f)RequestCycle().isRewindingQ因为我们在使用时经常利用pageBeginRender的初始化|所以这里有很多使用上的误区Q如果在pageBeginRender中从数据库读取数据来初始化跟表单提交无关的变量的话,可能被调用两次Q这个是应该避免的。什么叫跟表单提交无关的变量呢,是表单lg中跟赋值无关的Q例如上Ҏ(gu)到的value="ognl:picture.price",q时picture是与表单提交相关的变量Q如果你没有初始化,那么在赋值时调用getPicture().setPrice()׃(x)出现I指针异常,因ؓ(f)q是的picture为null。我们D个例子来看一下表单无关的变量Q假如这个picture面?x)显CZ个创建picture的表单和所有picture的列表,那这个picture的列表就是与表单提交无关的变量,如果你在pageBeginRender中初始化的话Q就需要区分是否rewindQ否则表单提交时׃(x)被初始化两次Q让我们看一下代码:(x)
Java代码 复制代码
  1. public abstract void setPictures(List<Picture> pictures);   
  2. public abstract void setPictureInList();//用于For中的value   
  3. public abstract void setPicture(Picture picture);//用于表单创徏   
  4. public abstract Picture getPicture();   
  5. public void pageBeginRender(PageEvent event) {   
  6. if(getPicture()==null){   
  7. setPicture(new Picture());   
  8. }   
  9. setPictures(getPictureService().findAll());   
  10. }  
判断picture是否为nullq赋值在面昄和rewind中都是需要的Q因为页面显C时Q需要调用getPicture().getPrice(),面rewindӞ需要调用getPicture().setPrice(),q两个阶D中的picture都不能ؓ(f)null。但setPictures?x)在表单提交时被调用两次Q在rewind阶段初始化它是没有用处的Q所以这时就要对是否rewindq行判断。修改后的代码如下:(x)
Java代码 复制代码
  1. public void pageBeginRender(PageEvent event) {   
  2. if(getPicture()==null){   
  3. setPicture(new Picture());   
  4. }   
  5. if (!event.getRequestCycle().isRewinding()) {   
  6. setPictures(getPictureService().findAll());   
  7. }   
  8. }  
q样可以避免在rewind时对picturesq行不必要的赋倹{这里还要提到的一Ҏ(gu)面昄和提交后的页面很可能不是同一个页面类的实例,大家都知道页面类的实例是从实例池取到的,用户打开面昄表单完后的页面类实例和用h交表单时的用来rewind的页面类实例不一定是同一个,即是一个实例,也是被重新初始化q的Q不要想当然的认为显C单后再提交那个实例应该保存原来显C的东西Q这个应该理清楚?

原文地址Qhttp://www.javaeye.com/article/41724

LifeNote 2008-03-08 16:03 发表评论
]]>
《J2EE核心(j)模式?DAO模式)http://m.tkk7.com/lifenote/archive/2008/02/15/180110.htmlLifeNoteLifeNoteFri, 15 Feb 2008 09:09:00 GMThttp://m.tkk7.com/lifenote/archive/2008/02/15/180110.htmlhttp://m.tkk7.com/lifenote/comments/180110.htmlhttp://m.tkk7.com/lifenote/archive/2008/02/15/180110.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/180110.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/180110.html很多的J2EE应用E序需要用持久性数?数据库、文件等)。不同的E序Q持久性存储是各不相同的,q且用来讉Kq些不同的持久性存储机制的API也有很大的不同。如果应用程序要在不同的持久性存储间q移Q这些访问特定持久存储层的代码将面(f)重写?br /> 如何解决q个问题?且看"DAO模式"

数据讉K对象(Data Acess Object) 模式
一.环境
Ҏ(gu)数据源不同,数据讉K也不同。根据存储的cd(关系数据库、面向对象数据库、文件等{?和供应商实现不同Q持久性存?比如数据?的访问差别也很大

?问题
许多真是的J2EE应用E序需要在一定程度上使用持久性数据。对于许多应用程序,持久性存储是使用不同的机制实现的,q且用来讉Kq些不同的持久性存储机制的API也有很大的不同?br /> 比如Q应用程序用实体bean(q里应该是指BMP的beanQCMP的bean已大大降低了(jin)与RDBMS的耦合)的分布式lg来表C持久性数据,或者用JDBC API来访问驻留在某关pL据库理pȝ(RDBMS)中的数据Q这些组件中包含q接性性和数据讉K代码?x)引入这些组件与数据源实C间的紧密耦合。组件中q类代码依赖性应用E序从某U数据源q移到其他种cȝ数据源将变得非常ȝ(ch)和困难。当数据源变化时Q组件也需要改变,以便于能够处理新cd的数据源

(举个例子来说Q我们UPTELpȝ是用JDBC API?nbsp;ORACLE数据库进行连接和数据讉K的,q些JDBC API与SQL语句散布在系l中Q当我们需要将UPTELq移到其他RDBMSӞ比如曄q移到INFORMIXQ就面(f)重写数据库连接和讉K数据的模块?

?作用?br /> 1.诸如bean理的实体bean、会(x)话bean、servlet{组件往往需要从持久性存储数据源中检索数据,以及(qing)q行数据存储{操作?br /> 2.Ҏ(gu)产品供应商的不同Q持久性存储API差别也很大,q些API和其能力同样Ҏ(gu)存储的类型不同也有差别,q样存在以下~点Q即讉Kq些独立pȝ的API很不l一?br /> 3.lg需要透明于实际的持久性存储或者数据源实现Q以便于提供C同供应商产品、不同存储类型和不同数据源类型的更容易的UL性?/p>

?解决Ҏ(gu)
使用数据讉K对象(DAO)模式来抽象和装所有对数据源的讉K。DAO理着与数据源的连接以便检索和存储数据?br /> DAO实现?jin)用来操作数据源的访问机制。数据源可以时RDBMS,LDAP,File{。依赖于DAO的业务组件ؓ(f)其客L(fng)使用DAO提供更简单的接口。DAO完全向客L(fng)隐藏?jin)数据源实现l节。由于当低层数据源实现变化时QDAO向客L(fng)提供的接口不?x)变化,所有该模式允许DAO调整C同的存储模式Q而不?x)?jing)响其客户端或者业务组件。重要的?DAO充当lg和数据源之间的适配器?/p>

(按照q个理论Q如果我们UPTELpȝ使用?jin)DAO模式,可以无~的从ORACLEq移CQ何一个RDBMS?jin)。梦xL很完的Q且看看DAO模式如何实现)



LifeNote 2008-02-15 17:09 发表评论
]]>
JSF中文输入q问题解决Ҏ(gu)http://m.tkk7.com/lifenote/archive/2008/01/31/178680.htmlLifeNoteLifeNoteThu, 31 Jan 2008 07:05:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/31/178680.htmlhttp://m.tkk7.com/lifenote/comments/178680.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/31/178680.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/178680.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/178680.html该方法已知适用的版本tomact5.0.18,tomcat5.0.9?br /> 已知不适用的版本ؓ(f)tomcat5.0.28?br /> 问题描述Q?br /> 在inputtext中输入中文,然后在输出,昄Zؕ码?br /> 解决Ҏ(gu)Q?br /> 1、自定义转器
package util;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.convert.Converter;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;

public class StringConverter implements Converter {
 public Object getAsObject(FacesContext context, UIComponent component,
   String newValues) throws ConverterException {
  String newstr = "";
  if (newValues == null) {
   newValues = "";
  }
  byte[] byte1 = null;
  try {
   byte1 = newValues.getBytes("ISO-8859-1");
   newstr = new String(byte1, "GB2312");
   UIInput input=(UIInput)component;//
   input.setSubmittedValue(newstr);
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }

  return newstr;

 }

 public String getAsString(FacesContext context, UIComponent component,
   Object Values) throws ConverterException { 
  return (String) Values;
 }
}

2、注册{换器
faces-config.xml片段
<converter>
  <converter-id>util.stringconverter</converter-id>
  <converter-class>util.StringConverter</converter-class>
</converter>

3、在面使用转换?br /> <h:inputText id="account" value="#{util.account}" required="true" styleClass="input" > 
 <f:converter converterId="utilstringconverter"/>



LifeNote 2008-01-31 15:05 发表评论
]]>
Tomcat,Weblogic {服务器 SSL 安全登陆的例?--附证书文件生成器http://m.tkk7.com/lifenote/archive/2008/01/15/175432.htmlLifeNoteLifeNoteTue, 15 Jan 2008 04:32:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/15/175432.htmlhttp://m.tkk7.com/lifenote/comments/175432.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/15/175432.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/175432.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/175432.html公司今天一个登陆的地方要修改,需要加一个SSL安全登陆,于是查些资料qȝ如下Q希望对有用的着的朋友有帮助
文g打包地址Qhttp://m.tkk7.com/Files/lifenote/tomcat配置ssl.rar
一下ؓ(f)帮助说明Q?br />
1.1. 安全d SSL
1.1.1  WebLogic下面SSL配置Q?br /> 1Q生?keystoreFileQ?br />  * keystoreFile 文g的生成:(x)
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks

 * csr 文g的生成:(x)
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks

 * 注意Q?http 的默认端口是80Qhttps 的默认端口是433Qftp 的默认端口是21?br /> 2Q部|keystore 文g
?<http://hostname:7001/console>  中配|刚才生成的 testKey.jks 文g?/p>

1.1.2 Tomcat 下面SSL配置


1Q生?keystoreFileQ?br />  * keystoreFile 文g的生成:(x)
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks

Example for inner testQ?br /> [root@localhost ~]#
/home/tomcat/jdk1.5.0_12/bin/keytool -genkey -alias localhost-tomcat -keyalg RSA -validity 365 -keystore /home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks
Enter keystore password:  someday2007
What is your first and last name?
  [Unknown]:  lifenote
What is the name of your organizational unit?
  [Unknown]:  Java
What is the name of your organization?
  [Unknown]:  Sunxc
What is the name of your City or Locality?
  [Unknown]:  Beijing
What is the name of your State or Province?
  [Unknown]:  Beijing
What is the two-letter country code for this unit?
  [Unknown]:  ZH
Is CN=lifenote, OU=Java, O=Sunxc, L=Beijing, ST=Beijing, C=ZH correct?
  [no]:  y

Enter key password for <localhost-tomcat>
        (RETURN if same as keystore password):  someday2007
[root@localhost ~]#

 

 * csr 文g的生成:(x)
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks

 * 注意Q?http 的默认端口是80Qhttps 的默认端口是433Qftp 的默认端口是21?/p>


2Q部|keystore 文g
  打开 server.xml 文gQ修改内容如下:(x)
 
 * 只需L server.xml 中对SSL定义的注释,在加?keystoreFile、keystorePass q两个属性即可?br />   <Service
      name="Catalina">
    <Connector
        port="8080"
  ...
    </Connector>
   
 <!-- Define a SSL HTTP/1.1 Connector on port 8443 --------------------- 要加入的内容在这?-->
    <Connector port="8443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
      keystoreFile="e:/temp_E/ssl/testKey.jks"
      keystorePass="aaaaaa"/>

    <Connector
        port="8009"
  ...
    </Connector>
 ...
Example for inner testQ?br />     <Connector port="443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
      keystoreFile="/home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks"
      keystorePass="password"/>


 注意需默认要?443 而不?8443Q要使用8443要在apache中配|,保证从apachehtomcat 采用 <https://ip:8443/>... 的格式?/p>


1.1.3 使用http讉KWebService s的客L(fng)配置
Servlet服务器配|好SSL之后Q客L(fng)可以使用https讉K?jin)?br /> 对于用户使用览器访问https的方式,览器会(x)弹出安装证书的对话框Q确认之后可以正怋用https讉K?br />  对于WebService 通过https方式讉KQ按照一下步骤:(x)
1Q?nbsp;WebService客户端要先取得keyStore文gQ?br /> 2Q?nbsp;虚拟机系l?System.setProperties(…) 讄keyStore信息Q?br /> 3Q?nbsp;使用 url=<https://ip:port/...> 讉KWebService服务

 

 



LifeNote 2008-01-15 12:32 发表评论
]]>
一个Struts的上传下载文件的E序http://m.tkk7.com/lifenote/archive/2008/01/14/175299.htmlLifeNoteLifeNoteMon, 14 Jan 2008 13:24:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/14/175299.htmlhttp://m.tkk7.com/lifenote/comments/175299.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/14/175299.html#Feedback3http://m.tkk7.com/lifenote/comments/commentRss/175299.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/175299.html Z(jin)节省I间Q文件中没有导入java包,导入eclipse后请自行加入java?br />
http://m.tkk7.com/Files/lifenote/
使用struts实现文g上传下蝲.rar

要把上面的地址都复制哦

LifeNote 2008-01-14 21:24 发表评论
]]>
java.lang.OutOfMemoryError 的解军_?/title><link>http://m.tkk7.com/lifenote/archive/2008/01/09/173982.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Wed, 09 Jan 2008 05:27:00 GMT</pubDate><guid>http://m.tkk7.com/lifenote/archive/2008/01/09/173982.html</guid><wfw:comment>http://m.tkk7.com/lifenote/comments/173982.html</wfw:comment><comments>http://m.tkk7.com/lifenote/archive/2008/01/09/173982.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/lifenote/comments/commentRss/173982.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lifenote/services/trackbacks/173982.html</trackback:ping><description><![CDATA[最q在使用Tomcat +Tapestry的时候遇见一个问题,׃Tapestry修改些内容后要重新启动(即配置?jin)一下那参数有时候也要重启)(j)当我修改?jin)页面的内?需要调试不断刷斎ͼ发现面昄的速度来慢 最后就出现?500错误java.lang.OutOfMemoryError  内存溢出Q在|上查了(jin)一下资?br /> 最后ȝ如下希望可以帮你解决同样的问?br /> 解决java.lang.OutOfMemoryError的方法有如下几种Q?br /> 1。增加jvm的内存大。方法有Q?nbsp;<br />              1Q在执行某个class文g时候,可以使用java -Xmx256M aa.class来设|运行aa.class时jvm所允许占用的最大内存ؓ(f)256M?br />              2Q对tomcat容器Q可以在启动时对jvm讄内存限度。对tomcatQ可以在catalina.bat中添加:(x)<br />   set CATALINA_OPTS=-Xms128M -Xmx256M<br />    set JAVA_OPTS=-Xms128M -Xmx256M<br /> 或者把%CATALINA_OPTS%?JAVA_OPTS%代替?Xms128M -Xmx256M <p>             3Q对resin容器Q同样可以在启动时对jvm讄内存限度。在bin文g夹下创徏一个startup.bat文gQ内容如下:(x)<br />                   @echo off<br />                    call "httpd.exe"  "-Xms128M" "-Xmx256M"<br />                    :end <br />                    其中"-Xms128M"为最内存,"-Xmx256M"为最大内存?/p> <p> 2.    优化E序Q释攑֞圾?/p> <img src ="http://m.tkk7.com/lifenote/aggbug/173982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lifenote/" target="_blank">LifeNote</a> 2008-01-09 13:27 <a href="http://m.tkk7.com/lifenote/archive/2008/01/09/173982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多模块Struts应用E序的几个问题(?qing)部分解x法)(j)http://m.tkk7.com/lifenote/archive/2008/01/04/172726.htmlLifeNoteLifeNoteFri, 04 Jan 2008 05:35:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/04/172726.htmlhttp://m.tkk7.com/lifenote/comments/172726.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/04/172726.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/172726.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/172726.htmlStruts?.1版本开始支持把应用E序分ؓ(f)多个模块Q每个模块可以看作独立的应用E序Q在带来方便的同Ӟ我也发现?jin)一些问题。比如有一?a class="UBBWordLink" target="_blank">struts应用E序分了(jin)大约十个模块Q现在有以下问题不知道大家一般是怎么解决的:(x)

1、因q行验证Q所以在每个模块对应的资源文仉都要?#8220;errors.required={0} is required.”{资源,有没有只用在一个文仉定义的方法?


2、用tiles的时候,要在每个模块对应的tiles-defs.xml里定义几乎相同的definitionQ有没有只用在一个文仉定义的方法?Q我试过在缺省模块里定义一个definitionQ然后在模块里extends它,但不行,extendsg只找当前模块Q?/p>

3、用ExceptionHandler的时候,Z么在exception标签里指定了(jin)bundle属性还是只在当前模块里找资源?我希望把一些重复用的异常处理声明在一个文仉Q例如NotLoginException、NoSuchObjectException{等Qƈ且它们对应的key也指向同一个资源文仉的资源(利用bundle属性)(j)Q怎么实现Q?/p>

l过一D|间的摸烦(ch)Q第一个和W三个问题基本上解决?jin),其实它们可以看作同一c问题,是资源的问题。在struts-config-xxx.xml里定义资源文件时Q可以指定一个factory属性,不指定时使用~省?#8220;org.apache.struts.util.PropertyMessageResourcesFactory”cR我的解x法是自定义一个CustomMessageResourcesFactoryc,多个资源文件以逗号分隔的Ş式作为参敎ͼ即message-resources的parameter属性)(j)传给它,在需要资源的地方?x)遍历它们进行查找。同时还要自定义一个CustomMessageResourcesc,它的getMessage()Ҏ(gu)里是查找资源的关键代码,而factory只是解析逗号分隔的参数构造ƈq回CustomMessageResources实例?/p>

CustomMessageResourcesFactory的代码比较简单,如下所C:(x)



package eg;

import java.util.Arrays;

import org.apache.struts.util.MessageResources;
import org.apache.struts.util.MessageResourcesFactory;

public class CustomMessageResourcesFactory extends MessageResourcesFactory{

    public MessageResources createResources(String config) {
        
        return new CustomMessageResources(Arrays.asList(config.split(",")));
    }

}
 

 


CustomMessageResourcesq微复杂一些,不过很幸q,我在|上扑ֈ?jin)一个完全符合自p求的c,下蝲地址?A&NBSP;HREF="HTTP: javaboutique.internet.com tutorials Dynaform source.zip?>

<message-resources factory="eg.CustomMessageResourcesFactory" 
    parameter="eg.ApplicationResources,eg.ErrorResources" />
 

 


上面参考了(jin)q篇文章



LifeNote 2008-01-04 13:35 发表评论
]]>
博客搬家E序是如何实现的http://m.tkk7.com/lifenote/archive/2007/12/27/170914.htmlLifeNoteLifeNoteThu, 27 Dec 2007 08:28:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/27/170914.htmlhttp://m.tkk7.com/lifenote/comments/170914.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/27/170914.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/170914.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/170914.html

LifeNote 2007-12-27 16:28 发表评论
]]>
Hibernate3 的DetachedCriteria 学习(fn)http://m.tkk7.com/lifenote/archive/2007/12/22/169494.htmlLifeNoteLifeNoteFri, 21 Dec 2007 18:44:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/22/169494.htmlhttp://m.tkk7.com/lifenote/comments/169494.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/22/169494.html#Feedback4http://m.tkk7.com/lifenote/comments/commentRss/169494.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/169494.html        Hibernate一直都认ؓ(f)比较?那么媄(jing)一下:(x)Q但最q项目当中遇见很多问题,今天看见别h在项目当中用了(jin) Hibernate3的DetachedCriteriaQ感觉真的是太好?jin),于是p?jin)点旉研究了(jin)一下,希望和大家分享一下吧
  针对q种需求,对于分层应用E序来说QW(xu)eb层需要传递一个查询的条g列表l业务层对象Q业务层对象获得q个条g列表之后Q然后依ơ取出条Ӟ构造查询语句。这里的一个难Ҏ(gu)条g列表用什么来构造?传统上用MapQ但是这U方式缺陷很大,Map可以传递的信息非常有限Q只能传递name和valueQ无法传递究竟要做怎样的条件运,I竟是大于,于QlikeQ还是其它的什么,业务层对象必ȝ切掌握每条entry的隐含条件。因此一旦隐含条件改变,业务层对象的查询构造算法必ȝ应修改,但是q种查询条g的改变是隐式U定的,而不是程序代码约束的Q因此非常容易出错?

  DetachedCriteria可以解决q个问题Q即在web层,E序员用DetachedCriteria来构造查询条Ӟ然后这个DetachedCriteria作ؓ(f)Ҏ(gu)调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后Q可以在session范围内直接构造CriteriaQ进行查询。就此,查询语句的构造完全被搬离到web层实玎ͼ而业务层则只负责完成持久化和查询的封装即可,与查询条件构造完全解耦,非常完美Q这恐怕也是以前很多企囑֜web层代码中构造HQL语句的h惛_现的梦想吧!

  CZ代码片段如下Q?

  web层程序构造查询条Ӟ(x)

  
Java代码:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20)));


  Department和Employee是一对多兌Q查询条件ؓ(f)Q?

  名称?#8220;department”开发部门;
  部门里面的雇员年龄大?0岁;

  业务层对象用该条g执行查询Q?

  java代码: detachedCriteria.getExecutableCriteria(session).list();

  最大的意义在于Q业务层代码是固定不变的Q所有查询条件的构造都在web层完成,业务层只负责在session内执行之。这样代码就可放之四(g)皆准,都无M改了(jin)?br />
  然而Spring和Hibernate3的DetachedCriteria有不兼容的问题,因此在Spring环境下面使用Hibernate3需要注意:(x)

  Spring的HibernateTemplate提供?jin)Hibernate的完封装,即通过匿名cd现回调,来保证Session的自动资源管理和事务的管理。其中核?j)方法是Q?

  java代码:
HibernateTemplate.execute(new HibernateCallback() {
 public Object doInHibernate(Session session) throws HibernateException {
  ....
 }
}

  回调Ҏ(gu)提供?jin)session作ؓ(f)参数Q有?jin)sessionQ就可以自由的用Hibernate API~程?jin)。用了(jin)spring的之后,代码修改如下Q?

  web层代码:(x)

  java代码:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20)));
departmentManager.findByCriteria(detachedCriteria);

  构造detachedCriteriaQ作为参C递给departmentManager

  业务层代码用springQDepartmentManager的findByCriteria如下Q?

  java代码:

public List findByCriteria(final DetachedCriteria detachedCriteria) {
 return (List) getHibernateTemplate().execute(new HibernateCallback() {
  public Object doInHibernate(Session session) throws HibernateException {
   Criteria criteria = detachedCriteria.getExecutableCriteria(session);
   return criteria.list();
  }
 });
}

  实际上也是Q?

  java代码:
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();

  而已

  但是该程序代码执行,?x)抛出强制类型{换异常!

  我跟t了(jin)一下spring和Hibernate源代码,原因如下Q?

  spring的HibernateTemplate的executeҎ(gu)提供的回调接口具有Session作ؓ(f)参数Q但是实际上Q默认情况下QHibernateTemplate传递给回调接口的sessionq不是org.hibernate.impl.SessionImplc,而是SessionImplcȝ一个ProxycR之所以替换成Z个Proxyc,HibernateTemplate的注释说明,Proxy提供?jin)一些额外的功能Q包括自动设|CachableQTransaction的超时时_(d)Session资源的更U极的关闭等{?

  java代码:
private boolean exposeNativeSession = false;
...

  executeҎ(gu)内部Q?
Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));

  但是遗憾的是QHibernate的DetachedCriteria的setExecutableCriteriaҎ(gu)却要求将session参数强制转ؓ(f)SessionImplQ但是spring传过来的却是一个Proxyc,因此报错了(jin)?

  java代码:
public Criteria getExecutableCriteria(Session session) {
 impl.setSession( (SessionImpl) session ); // 要求SessionImplQSpring传递的是Proxy
 return impl;
}

  解决Ҏ(gu)Q禁止Spring的HibernateTemplate传递Proxyc,强制要求它传递真实的SessionImplc,即给exexuteҎ(gu)增加一个参敎ͼ提供参数为trueQ如下:(x)

  java代码:
public List findByCriteria(final DetachedCriteria detachedCriteria) {
 return (List) getHibernateTemplate().execute(new HibernateCallback() {
  public Object doInHibernate(Session session) throws HibernateException {
   Criteria criteria = detachedCriteria.getExecutableCriteria(session);
   return criteria.list();
  }
 }, true);
}


LifeNote 2007-12-22 02:44 发表评论
]]>
★★oracle易忘函数用法★★http://m.tkk7.com/lifenote/archive/2007/12/14/167677.htmlLifeNoteLifeNoteFri, 14 Dec 2007 02:02:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/14/167677.htmlhttp://m.tkk7.com/lifenote/comments/167677.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/14/167677.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/167677.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/167677.html===================★★oracle易忘函数用法★★=====================================
                                                                开发积累资?br />                                                                 Author:SunXianchao
                                                                2006q于湖南长沙
==============================================================================
一般的to_char是这L(fng)的to_char(sysdate,'YYYY-MM-DD hh:mi:ss AM') Q也有几个突出点的用法:(x)

to_char(sysdate, 'dd') 查看今天是几号to_char(sysdate, 'ww') 查看q是q个月第几个星期

to_char(sysdate, 'mm')  查看q是一q中W几个月

to_char(sysdate, 'yyyy') 查看q䆾last_day(to_date('2007-02-01','YYYY-MM-DD'))查看一个月的最后一天,add_months(sysdate,10)查看若干个月后的今天Qnext_day(sysdate,'星期?)l个日期查看后面的最q的星期几的日期Q不q这个星期五要是换成英文居然有问题,W?个参数可以是数字1-7Q分别表C周日到周六?/p>

下面贴个全的Q需要的时候顺便查一下?/p>

一、PL/SQL单行函数和组函数详解

函数是一U有零个或多个参数ƈ且有一个返回值的E序。在SQL中Oracle内徏?jin)一pd函数Q这些函数都可被UCؓ(f)SQL或PL/SQL语句Q函C要分Z大类Q单行函数和l函数?/p>

本文讨论如何利用单行函C?qing)用规则?br /> 1、SQL中的单行函数

SQL和PL/SQL中自带很多类型的函数Q有字符、数字、日期、{换、和混合型等多种函数用于处理单行数据Q因此这些都可被l称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY{子句中Q例如下面的例子中就包含?jin)TO_CHAR,UPPER,SOUNDEX{单行函数?/p>

SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)


单行函数也可以在其他语句中用,如update的SET子句QINSERT的VALUES子句QDELET的WHERE子句,认证考试特别注意在SELECT语句中用这些函敎ͼ所以我们的注意力也集中在SELECT语句中?/p>

2、NULL和单行函?/p>

在如何理解NULL上开始是很困隄Q就是一个很有经验的Z然对此感到困惑。NULLDCZ个未知数据或者一个空|术操作W的M一个操作数为NULL|l果均ؓ(f)提个NULL?q个规则也适合很多函数Q只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了(jin)NULL参数时能够返回非NULL倹{在q些中NVL函数时最重要的,因ؓ(f)他能直接处理NULL|NVL有两个参?NVL(x1,x2),x1和x2都式表达式,当x1为null时返回X2,否则q回x1?/p>

下面我们看看emp数据表它包含?jin)薪水、奖金两,需要计ȝ补偿?/p>

column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2


不是单的薪水和奖金加v来就可以?jin),如果某一行是null值那么结果就是nullQ比如下面的例子Q?/p>

update empset salary=(salary+bonus)*1.1


q个语句中,雇员的工资和奖金都将更新Z个新的|但是如果没有奖金Q即 salary + null,那么׃(x)得出错误的结论,q个时候就要用nvl函数来排除null值的影响?/p>

所以正的语句是:(x)

update empset salary=(salary+nvl(bonus,0)*1.1


3、单行字W串函数

单行字符串函数用于操作字W串数据Q他们大多数有一个或多个参数Q其中绝大多数返回字W串?/p>

ASCII()

c1是一字符Ԍq回c1W一个字母的ASCII码,他的逆函数是CHR()

SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122


CHR()[NCHAR_CS]

i是一个数字,函数q回十进制表C的字符?/p>

select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B


CONCAT(,)

c1,c2均ؓ(f)字符Ԍ函数c2q接到c1的后面,如果c1为null,返回c2.如果c2为null,则返回c1Q如果c1、c2都ؓ(f)nullQ则q回null。他和操作符||q回的结果相?/p>

select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda
INITCAP()

c1Z字符丌Ӏ函数将每个单词的第一个字母大写其它字母小写返回。单词由I格Q控制字W,标点W号限制?/p>

select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici


INSTR(,[,[,]])

c1,c2均ؓ(f)字符Ԍi,j为整数。函数返回c2在c1中第jơ出现的位置Q搜索从c1的第i个字W开始。当没有发现需要的字符时返?,如果i敎ͼ那么搜烦(ch)从叛_左进行,但是位置的计还是从左到叻Ii和j的缺省gؓ(f)1?/p>

select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2


INSTRB(,[,i[,j])

与INSTR()函数一P只是他返回的是字节,对于单字节INSTRB(){于INSTR()?/p>

LENGTH()

c1为字W串Q返回c1的长度,如果c1为nullQ那么将q回null倹{?/p>

select LENGTH('Ipso Facto') ergo from dualergo10


LENGTHb()

与LENGTH()一Pq回字节?/p>

lower()

q回c的小写字W,l常出现在where子串中?/p>

select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite


LPAD(,[,])

c1,c2均ؓ(f)字符Ԍi为整数。在c1的左侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ(f)单空|参见RPAD?/p>

select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe


LTRIM(,)

把c1中最左边的字W去掉,使其W一个字W不在c2中,如果没有c2Q那么c1׃?x)改变?/p>

select LTRIM('Mississippi','Mis') from dualLTRppi


RPAD(,[,])

在c1的右侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ(f)单空?其他与LPAD怼?/p>

RTRIM(,)

把c1中最双的字W去掉,使其W后一个字W不在c2中,如果没有c2Q那么c1׃?x)改变?/p>

REPLACE(,[,])

c1,c2,c3都是字符Ԍ函数用c3代替出现在c1中的c2后返回?/p>

select REPLACE('uptown','up','down') from dualREPLACEdowntown


STBSTR(,[,])

c1Z字符Ԍi,j为整敎ͼ从c1的第i位开始返回长度ؓ(f)j的子字符Ԍ如果j为空Q则直到串的N?/p>

select SUBSTR('Message',1,4) from dualSUBSMess


SUBSTRB(,[,])

与SUBSTR大致相同Q只是I,J是以字节计算?/p>

SOUNDEX()

q回与c1发音怼的词?/p>

select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250


TRANSLATE(,,)

c1中与c2相同的字W以c3代替

select TRANSLATE('fumble','uf','ar') test from dualTEXTramble


TRIM([[]] from c3)

c3串中的第一个,最后一个,或者都删除?/p>

select TRIM(' space padded ') trim from dual TRIMspace padded


UPPER()

q回c1的大写,常出现where子串?/p>

select name from dual where UPPER(name) LIKE 'KI%'NAMEKING


4、单行数字函?/p>

单行数字函数操作数字数据Q执行数学和术q算。所有函数都有数字参数ƈq回数字倹{所有三角函数的操作数和值都是弧度而不是角度,oracle没有提供内徏的弧度和角度的{换函数?/p>

ABS()

q回n的绝对?/p>

ACOS()

反余弦函敎ͼq回-1?之间的数。n表示弧度

select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0


ASIN()

反正弦函敎ͼq回-1?Qn表示弧度

ATAN()

反正切函敎ͼq回n的反正切|n表示弧度?/p>

CEIL()

q回大于或等于n的最整数?/p>

COS()

q回n的余玄|n为弧?/p>

COSH()

q回n的双曲余玄|n 为数字?/p>

select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847


EXP()

q回e的nơ幂Qe=2.71828183.

FLOOR()

q回于{于N的最大整数?/p>

LN()

q回N的自然对敎ͼN必须大于0

LOG(,)

q回以n1为底n2的对?/p>

MOD()

q回n1除以n2的余?br /> POWER(,)

q回n1的n2ơ方

ROUND(,)

q回舍入数点右边n2位的n1的|n2的缺省gؓ(f)0Q这回将数Ҏ(gu)接近的整敎ͼ如果n2数就舍入到小数点左边相应的位上,n2必须是整数?/p>

select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54


SIGN()

如果n敎ͼq回-1,如果n为正敎ͼq回1Q如果n=0q回0

SIN()

q回n的正玄?n为弧度?/p>

SINH()

q回n的双曲正玄?n为弧度?/p>

SQRT()

q回n的^Ҏ(gu),n为弧?/p>

TAN()

q回n的正切?n为弧?/p>

TANH()

q回n的双曲正切?n为弧?/p>

TRUNC(,)

q回截尾到n2位小数的n1的|n2~省讄?Q当n2为缺省设|时?x)将n1截尾为整敎ͼ如果n2|截֜数点左边相应的位上?/p>

5、单行日期函?/p>

单行日期函数操作DATA数据cdQ绝大多数都有DATA数据cd的参敎ͼl大多数q回的也是DATA数据cd的倹{?/p>

ADD_MONTHS(,)

q回日期d加上i个月后的l果。i可以使Q意整数。如果i是一个小敎ͼ那么数据库将隐式的他转换成整敎ͼ会(x)截去数点后面的部分?/p>

LAST_DAY()

函数q回包含日期d的月份的最后一?/p>

MONTHS_BETWEEN(,)

q回d1和d2之间月的数目,如果d1和d2的日的日期都相同Q或者都使该月的最后一天,那么返回一个整敎ͼ否则?x)返回的l果包含一个分数?/p>

NEW_TIME(,,)

d1是一个日期数据类型,当时区tz1中的日期和时间是dӞq回时区tz2中的日期和时间。tz1和tz2时字W串?/p>

NEXT_DAY(,)

q回日期d后由dowl出的条件的W一天,dow使用当前?x)话中给出的语言指定?jin)一周中的某一天,q回的时间分量与d的时间分量相同?/p>

select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004


ROUND([,])

日期d按照fmt指定的格式舍入,fmt为字W串?/p>

SYADATE

函数没有参数Q返回当前日期和旉?/p>

TRUNC([,])

q回由fmt指定的单位的日期d
6、单行{换函?/p>

单行转换函数用于操作多数据类型,在数据类型之间进行{换?/p>

CHARTORWID()

c 使一个字W串Q函数将c转换为RWID数据cd?/p>

SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')


CONVERT(,[,])

c֭W串Qdset、sset是两个字W集Q函数将字符串c由sset字符集{换ؓ(f)dset字符集,sset的缺省设|ؓ(f)数据库的字符集?/p>

HEXTORAW()

x?6q制的字W串Q函数将16q制的x转换为RAW数据cd?/p>

RAWTOHEX()

x是RAW数据cd字符Ԍ函数RAW数据c{换ؓ(f)16q制的数据类型?/p>

ROWIDTOCHAR()

函数ROWID数据cd转换为CHAR数据cd?/p>

TO_CHAR([[,)

x是一个data或number数据cdQ函数将x转换成fmt指定格式的char数据cdQ如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制q回的月份和日䆾所使用的语a。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定数位和千分位的分隔W,以及(qing)货币W号?/p>

NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"


TO_DATE([,[,)

c表示字符Ԍfmt表示一U特D格式的字符丌Ӏ返回按照fmt格式昄的c,nlsparm表示使用的语a。函数将字符串c转换成date数据cd?/p>

TO_MULTI_BYTE()

c表示一个字W串Q函数将c的担子截字符转换成多字节字符?/p>

TO_NUMBER([,[,)

c表示字符Ԍfmt表示一个特D格式的字符Ԍ函数q回值按照fmt指定的格式显C。nlsparm表示语言Q函数将q回c代表的数字?/p>

TO_SINGLE_BYTE()

字W串c中得多字节字W{化成{h(hun)的单字节字符。该函数仅当数据库字W集同时包含单字节和多字节字W时才?/p>

7、其它单行函?/p>

BFILENAME(,)


dir是一个directorycd的对象,fileZ文g名。函数返回一个空的BFILE位置值指C符Q函数用于初始化BFILE变量或者是BFILE列?/p>

DECODE(,,[,,,[])

x是一个表辑ּQm1是一个匹配表辑ּQx与m1比较Q如果m1{于xQ那么返回r1,否则,x与m2比较Q依ơ类推m3,m4,m5....直到有返回结果?/p>

DUMP(,[,[,[,]]])

x是一个表辑ּ或字W,fmt表示8q制?0q制?6q制、或则单字符。函数返回包含了(jin)有关x的内部表CZ息的VARCHAR2cd的倹{如果指定了(jin)n1,n2那么从n1开始的长度为n2的字节将被返回?/p>

EMPTY_BLOB()

该函数没有参敎ͼ函数q回 一个空的BLOB位置指示W。函数用于初始化一个BLOB变量或BLOB列?/p>

EMPTY_CLOB()

该函数没有参敎ͼ函数q回 一个空的CLOB位置指示W。函数用于初始化一个CLOB变量或CLOB列?/p>

GREATEST()

exp_list是一列表辑ּQ返回其中最大的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,那么q回的结果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?br /> LEAST()

exp_list是一列表辑ּQ返回其中最的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,返回的l果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?/p>

UID

该函数没有参敎ͼq回唯一标示当前数据库用L(fng)整数?/p>

USER

q回当前用户的用户名

USERENV()

Zoptq回包含当前?x)话信息。opt的可选gؓ(f)Q?/p>

ISDBA  ?x)话中SYSDBA脚色响应Q返回TRUE

SESSIONID  q回审计?x)话标示W?/p>

ENTRYID q回可用的审计项标示W?/p>

INSTANCE在会(x)话连接后Q返回实例标C符。该值只用于q行Parallel 服务器ƈ且有 多个实例的情况下使用?/p>

LANGUAGEq回语言、地域、数据库讄的字W集?/p>

LANGq回语言名称的ISO~写?/p>

TERMINAL为当前会(x)话用的l端或计机q回操作pȝ的标C符?/p>

VSIZE()            x是一个表辑ּ。返回x内部表示的字节数?/p>

二、SQL中的l函?/p>

l函C叫集合函敎ͼq回Z多个行的单一l果Q行的准数量无法确定,除非查询被执行ƈ且所有的l果都被包含在内。与单行函数不同的是Q在解析时所有的行都是已知的。由于这U差别ɾl函C单行函数有在要求和行Z有微的差异.

1、组(多行)函数

与单行函数相比,oracle提供?jin)丰富的Zl的Q多行的函数。这些函数可以在select或select的having子句中用,当用于select子串时常帔R和GROUP BY一起用?/p>

AVG([{DISYINCT|ALL}])

q回数值的q_倹{缺省设|ؓ(f)ALL

SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413


COUNT({*|DISTINCT|ALL} )

q回查询中行的数目,~省讄是ALL,*表示q回所有的行?/p>

MAX([{DISTINCT|ALL}])

q回选择列表目的最大|如果x是字W串数据cdQ他q回一个VARCHAR2数据cdQ如果X是一个DATA数据cdQ返回一个日期,如果X是numeric数据cdQ返回一个数字。注意distinct和all不v作用Q应为最大gq两U设|是相同的?/p>

MIN([{DISTINCT|ALL}])

q回选择列表目的最倹{?/p>

STDDEV([{DISTINCT|ALL}])

q回选者的列表目的标准差Q所谓标准差是方差的qx栏V?/p>

SUM([{DISTINCT|ALL}])

q回选择列表目的数值的d?/p>

VARIANCE([{DISTINCT|ALL}])

q回选择列表目的统计方差?/p>

2、用GROUP BYl数据分l?/p>

正如题目暗示的那L(fng)函数是操作那些已经分好l的数据Q我们告诉数据库用GROUP BY怎样l数据分l或者分c,当我们在SELECT语句的SELECT子句中用组函数Ӟ我们必须把ؓ(f)分组或非常数列放|在GROUP BY子句中,如果没有用group byq行专门处理Q那么缺省的分类是将整个l果设ؓ(f)一cR?/p>

select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982


在这个例子中Q我们用state字段分类;如果我们要将l果按照zip_codes排序,可以用ORDER BY语句QORDER BY子句可以使用列或l函数?/p>

select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982


3、用HAVING子句限制分组数据

现在你已l知道了(jin)在查询的SELECT语句和ORDER BY子句中用主函数Q组函数只能用于两个子串中,l函C能用于WHERE子串中,例如下面的查询是错误的:(x)

错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk

q个语句中数据库不知道SUM()是什么,当我们需要指C数据库对行分组Q然后限制分l后的行的输出时Q正的Ҏ(gu)是用HAVING语句Q?/p>

SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;


4、嵌套函?/p>

函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可l承的执行过E。但函数的优先权只是Z位置Q函数遵循由内到外,由左到右的原则。嵌套技术一般用于象DECODEq样的能被用于逻辑判断语句IF....THEN...ELSE的函数?/p>

嵌套函数可以包括在组函数中嵌套单行函敎ͼ或者组函数嵌套入单行函数或l函C。比如下面的例子Q?/p>

SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2


 



LifeNote 2007-12-14 10:02 发表评论
]]>
Java 软gI间http://m.tkk7.com/lifenote/archive/2007/12/14/167656.htmlLifeNoteLifeNoteFri, 14 Dec 2007 01:23:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/14/167656.htmlhttp://m.tkk7.com/lifenote/comments/167656.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/14/167656.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/167656.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/167656.html注册?jin)一个网站,使用的是下面的这个空_(d)常来|,无限I间大小完全免费Q上传速度很不错,感觉挺好推荐l大Ӟ来注册一个空间上传资料?br /> http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99


LifeNote 2007-12-14 09:23 发表评论
]]>
Tapestry 开发笔讎ͼU篏Q?/title><link>http://m.tkk7.com/lifenote/archive/2007/12/13/167528.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 13 Dec 2007 08:21:00 GMT</pubDate><guid>http://m.tkk7.com/lifenote/archive/2007/12/13/167528.html</guid><wfw:comment>http://m.tkk7.com/lifenote/comments/167528.html</wfw:comment><comments>http://m.tkk7.com/lifenote/archive/2007/12/13/167528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/lifenote/comments/commentRss/167528.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lifenote/services/trackbacks/167528.html</trackback:ping><description><![CDATA[<p>====================================================================================<br /> ' 说明QTapestry 开发笔?br /> ' Note Author: Sunxianchao<br /> ' 阅读日期Q?nbsp;2007-9-18(北京.七彩?<br /> '====================================================================================<br /> <br /> <br /> <br /> '先做个小q告 免费的无限空间还可以是要积?下面是我的注册地址 直接注册可以了(jin) 奖励10个积?br /> http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99<br /> ȝ(ch)帮忙一?多谢<br /> <br /> <br /> 【各U组Z用?br /> 说明Q只是说明一些需要注意的东西Q更多的学习(fn)参考Tapestry官方文档<br /> 1、For<br /> source:是对应的javac里的List 对象或者是个数l?需要抽?或者提供set getҎ(gu)<br /> value:是@环这个source对象代表当前的一?Q需要在page文g中设|问一个属性,可以不在对应的javac里有这个属?br /> index:是@环的索引?同value一?在page文g中设|一个属性即?<property name="index"/><br /> 在@环的时??x)自动?f)vlaue和index赋当前的?/p> <p>2、Foreach 和For一样?/p> <p>3、Hiddenlg L多余S的处?br />  <input jwcid="@Hidden" type="hidden" value="ognl:blahblah" encode="false"/></p> <p><br /> 4?Insert lg <br /> e.g. <br />     <input type="text" jwcid="name@Insert" value="ognl:user.name"/> <br />     面表现?会(x)到页面类中寻找getUser().getName()Ҏ(gu)获取初值ƈ输出 <br />     相当于在面上显C数?</p> <p>5?TextField lg <br /> e.g. <br />     <input type="text" jwcid="username@TextField" value="ognl:username"/> <br />     面表现?会(x)到页面类中寻找getUsername()Ҏ(gu)获取初?<br />     *如果是修改信息页?通常初始D在页面表C前由setUsername()手动讄从数据库中读取出来的?<br />     表单提交?通过setUsername()写入新?即用戯入?,在类中通过getUsername()获取新?<br />     相当于在修改个h信息?首先d用户名赋予文本框(用户?初?用户修改时填入新?后台获取?<br />     *Hidden属性区分是普通文本输入框(默认false)和密码输入框(hidden="ognl:true") <br />     readonly属性设|只?readonly="true"为只?后台可读? <br />     *disabled属性设|是否可?diabled="true"Z可写(后台也不可读?</p> <p>6?TextArea lg <br /> e.g. <br />     <textarea jwcid="content@TextArea" value="ognl:content" cols="40" rows="10"></textarea> <br />     面表现?会(x)到页面类中寻找getContent()Ҏ(gu)获取初?<br />     工作原理同TextField</p> <p>7?RadioGroup/Radio lg <br /> e.g. <br />     <span jwcid="headImage@RadioGroup" selected="ognl:headImage"> <br />       <input jwcid="@Radio" type="radio" value="1"/>头像1 <br />       <input jwcid="@Radio" type="radio" value="2"/>头像2 <br />       <input jwcid="@Radio" type="radio" value="3"/>头像3 <br />       <input jwcid="@Radio" type="radio" value="4"/>头像4 <br />       <input jwcid="@Radio" type="radio" value="5"/>头像5 <br />       <input jwcid="@Radio" type="radio" value="6"/>头像6 <br />     </span> <br />     RadioGroup为每一个Radio提供一个唯一的ID。RadioGroup跟踪当前被选中的属性|q且只有一个Radio能够被选中. <br />     面提交ӞRadioGrouplg利用OGNL表达式向headImage字段写入被选中的Radiolg的value参数? <br />     面表现?修改面),会(x)到页面类中寻找getHeadImage()Ҏ(gu)获取初?然后L@Radiolg中与其相同的lgq勾选上.</p> <p>8?PropertySelection lg <br />     使用PropertySelectionlg必须要构造一个类来实现IPropertySelectionModel接口Qƈ且重写该接口?个方? <br />     public int getOptionCount() //提供下拉菜单的长?<br />     public Object getOption(int index) //提供select标签的option <br />     public String getLabel(int index) //提供select标签的Label|也就是下拉菜单显C的内容 <br />     public String getValue(int index) //提供select标签的value?<br />     public Object translateValue(String value) //selected后的q回|value值未必就是我们需要的q回|可以在这个方法里面对q回的value做对应的转换或修? <br /> e.g.1. 性别下拉?<br />     <select jwcid="gender@ProPertySelection" name="genderSelect" value="ognl:gender" model="supportedGender"> <br />       <option selected>先生</option> <br />       <option>奛_</option> <br />     </select> </p> <p><br /> 代码<br /> GenderSelectionModel.java   <br /> public class GenderSelectionModel implements IPropertySelectionModel {   <br />   <br />     public static final String male = "先生";   <br />   <br />     public static final String female = "奛_";   <br />   <br />     public static final String[] genderOptions = { male, female };   <br />   <br />     public int getOptionCount() {   <br />         return genderOptions.length;   <br />     }   <br />   <br />     public Object getOption(int index) {   <br />         return this.translateValue(genderOptions[index]);   <br />     }   <br />   <br />     public String getLabel(int index) {   <br />         return genderOptions[index].toString();   <br />     }   <br />   <br />     public String getValue(int index) {   <br />         return genderOptions[index];   <br />     }   <br />   <br />     public Object translateValue(String value) {   <br />         if (value.equals("先生")) {   <br />             return "1";   <br />         } else {   <br />             return "0";   <br />         }   <br />     }   <br /> }  </p> <p> </p> <p>代码<br /> ModUserInfo.java   <br /> public IPropertySelectionModel getSupportedGender() {   <br />     return new GenderSelectionModel();   <br /> }  </p> <p><br />     存入数据库中"1"代表先生,"0"代表奛_,通过translateValue(String value)Ҏ(gu)转换 <br />     面表现?通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedGender(). <br />     然后通过getGender()Ҏ(gu)获取初?比如获取"0",则在面昄时寻找valuegؓ(f)"0"的选项即ؓ(f)"奛_",q择之作为初始选择?</p> <p>e.g.2. 日志cd下拉?<br />     <select jwcid="logType@PropertySelection" name="typeSelect" value="ognl:logType" model="supportedType"> <br />       <option>?j)情日?lt;/option> <br />       <option>情感天地</option> <br />       <option>生活感触</option> <br />     </select> </p> <p><br /> 代码<br /> TypeSelectionModel.java   <br /> public class TypeSelectionModel implements IPropertySelectionModel {   <br />        <br />     private List typeList = new ArrayList();   <br />   <br />     public TypeSelectionModel(List typeList) {   <br />         this.typeList = typeList;   <br />     }   <br />   <br />     public int getOptionCount() {   <br />         return typeList.size();   <br />     }   <br />   <br />     public Object getOption(int index) {   <br />         return ((LogType)typeList.get(index)).getValue();   <br />     }   <br />   <br />     public String getLabel(int index) {   <br />         return ((LogType) typeList.get(index)).getName();   <br />     }   <br />   <br />     public String getValue(int index) {   <br />         return ((LogType) typeList.get(index)).getValue();   <br />     }   <br />   <br />     public Object translateValue(String value) {   <br />         return value;   <br />     }   <br /> }  </p> <p> </p> <p>代码<br /> ModLog.java   <br /> public IPropertySelectionModel getSupportedType() {   <br />     TypeSelectionModel typeSelectionModel =    <br />                            new TypeSelectionModel(loadType(getUser().getUserId()));   <br />     return typeSelectionModel;   <br /> }   <br />   <br /> private List loadType(int userid) {   <br />     ...//从数据库载入该用L(fng)日志cd列表   <br /> }  </p> <p><br />     面表现?通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedType(). <br />     然后通过value属性给出的初始值即,getLogType()Ҏ(gu)获取初?比如获取"2",则在面昄时寻找valuegؓ(f)"2"的选项即ؓ(f)"生活感触",q择之作为初始选择?</p> <p>9?Formlg <br /> e.g. <br />     <form jwcid="logForm@Form"> <br />       ... <br />     </form> <br />     Form的监?listener)Ҏ(gu)可以有两U方? <br />       1. 在Formlg中声? <br />         <form jwcid="logForm@Form" listener="ognl:listener:onLogin"> <br />           ... <br />         </form> <br />       2. 在submitcdlg中声? <br />         <input type="submit" jwcid="onLogin@Submit" listener="listener:onLogin" value="发表"/>或?<br />         <span jwcid="@ImageSubmit" image="..." listener="listener:onLogin"><img src="..." width="" height=""/></span> <br />       前一U方式当Form中只要有submit׃(x)触发监听Ҏ(gu),后一U方式是Form中有多个submit,各自实现不同的监听方?</p> <p>G) Foreach lg <br /> e.g. <br />     <span jwcid="@Foreach" source="ognl:logList" value="ognl:item"> <br />     循环lg,遍历source参数,在表现其内容前更新value参数,Foreachlg所包含的内定w复表?其中可以通过value参数获取所需昄内容. <br />     本例?面表现旉过getLogList()Ҏ(gu)获取日志列表,循环取出其中数据更新item(日志对象)q予以显C?其中item需要在面规范(.page)文g中声? <br />     <property name="item"/> <br />     *class参数用来LcMCSS的文件对Foreachq行修饰. <br />     Foreachlg: class="ognl:beans.evenOdd.next" <br />     Page文g: <bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd"/> <br />     CSS文g: tr.odd{background-color: #ffffff;}tr.even{background-color: #eeeeee;}</p> <p>10?Conditional lg <br /> e.g. <br />     <span jwcid="@Conditional" condition='ognl:item.sex.equals("1")'>先生</span> <br />     <span jwcid="@Conditional" condition='ognl:item.sex.equals("0")'>奛_</span> <br />     conditional参数为true时运行Conditionallg中的HTML模板内容. <br />     在Tapestry4.0以后׃支持该组件了(jin), 可以使用其他lg来实? <br />     1. Contrib:Choose和Contrib:When <br />     <library id="contrib" specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/>(.application文g中引入Contribcd) <br />     <span jwcid="@contrib:Choose"> <br />       <span jwcid="@contrib:When" condition='ognl:user.gender.equals("1")'>先生</span> <br />       <span jwcid="@contrib:When" condition='ognl:user.gender.equals("0")'>奛_</span> <br />     </span> <br />     2. Iflg <br />     <span jwcid="@If" condition='ognl:item.sex.equals("1")'>先生</span> <br />     <span jwcid="@If" condition='ognl:item.sex.equals("0")'>奛_</span> <br />     3. Elselg<br />     <span jwcid="@Else">man</span> </p> <p>?===========================ts的函数执行顺?=======================================?br /> 对之前的该文章进行了(jin)一些修正,主要是针对finishLoad()Ҏ(gu)?<br /> 我觉得对初学者会(x)有一些帮助?<br /> 下面q几个函数是我在使用的,它们的执行顺序依ơ从上到下?<br /> 1.protected void finishLoad() {} *** <br /> 2.public void pageValidate(PageEvent event) {} <br /> 3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} <br /> 4.public void pageBeginRender(PageEvent event) {} <br /> // 如果有表单提交,则将form中的各字D늚Dl页面类 <br /> 5. ...... 赋?<br /> 6.public void submit() // 表单提交{用listenter:调用的方?<br /> 7.protected void prepareForRender(IRequestCycle cycle) {} <br /> ---------------------------------------------------- <br /> 1.protected void finishLoad() {} <br /> q个函数最先执行,但是它实际上没有什么用处(我感觉)(j)。因为:(x) <br />   q个函数只在面池中没有某一个页面类、需要生成一个新的页面对象时才调用。这里就有一个陷阱:(x)如果你的tomcat启动时用了(jin)-Dorg.apache.tapestry.disable-caching=true(Z(jin)调试方便而设)Q那么你每次h面Ӟ它都?x)执行(因?f)每个request都会(x)新生成一个页面类对象Q,造成?jin)它L执行的假象。在实际的部|时Q会(x)使用cachingQ则q个函数执行的机?x)很。所以要注意?<br />   初始化的代码攑֜4 pageBeginRender()?<br /> 2.public void pageValidate(PageEvent event) {} <br /> 如果实现?jin)PageValidateListener接口Q则可以在这里进行验证,比如讉K权限{。执行完1后,它就开始执行?<br /> 3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} <br /> 如果实现?jin)IExternalPage接口Q则可以从这里取得由外面传过来的参数。执?后,执行到这里。在q里可以把那些参数取出,赋给面cR?<br /> 4.public void pageBeginRender(PageEvent event) {} <br /> 执行?后,执行本函数。但是这时从客户端传q来的参数还没有被赋?如果提交?jin)表单的?。这里可以进行一些初始化操作?<br /> 5.执行?后,如果有表单提交,在这里将?x)取出那些|赋给对应的字Dc(din)?注意Q只是将表单中有的Dq来) <br /> 6.public void submit() <br /> 如果有表单提交的话,在这里将q行对应的操作。因为此时各字段已经取好g(jin)Q所以可以拿来直接用?<br /> 7.protected void prepareForRender(IRequestCycle cycle) {} <br /> 最后才执行q个Ҏ(gu)。我们可以在其中q行Z(jin)在页面上昄数据而进行的操作Q比如取得什么对象什么的Q因里页面类的属性赋值已l结束,可以直接拿来使用?jin)?<br /> 注意Q如果执行了(jin)6Q则q要执行4Q再执行7。如果没?Q?完了(jin)q接是7?<br /> 以上是我所ȝ的执行顺序,不当之处h出?nbsp;      </p> <p>----------------------------------------------------- <br /> 最开始学tapestry的时候,觉得“怎么有这么多地方需要持久啊”。原来以前只知道pageBeginRenderq个函数Q什么初始化操作都放在它里面。可是它是在赋g前执行,所以拿到的字段多都是空的,却都以ؓ(f)是没有持久化的缘故。所以在客户端里放了(jin)一大堆的@HiddenQ或者session中持久,非常ȝ(ch)Q,Q对tapestry也生的怀疑。现在才知道那些需要取得客L(fng)传来的参数的代码Q最好放在prepareForRender里,很多不必要的持久都可以省掉了(jin)</p> <img src ="http://m.tkk7.com/lifenote/aggbug/167528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lifenote/" target="_blank">LifeNote</a> 2007-12-13 16:21 <a href="http://m.tkk7.com/lifenote/archive/2007/12/13/167528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>装?jin)一个hibernate 整合spring 的dao对象http://m.tkk7.com/lifenote/archive/2007/12/10/166636.htmlLifeNoteLifeNoteMon, 10 Dec 2007 05:41:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/10/166636.htmlhttp://m.tkk7.com/lifenote/comments/166636.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/10/166636.html#Feedback7http://m.tkk7.com/lifenote/comments/commentRss/166636.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/166636.html 暂时没有写web?仅用?jin)一个main试的hibernate 整合spring的部?框架大概是这L(fng)
StudentDAO l承AbstractService q个是我使用spring的hibernate摸板装好的和数据库讉K的方?br />                      实现StudentServer q个接口是和自己业务相关的方?在调用StudentDAO 的时候用接口指向子c?br />

public class Test {

    
/**
     * 
@param args
     * 
@throws QueryException 
     
*/

    
public static void main(String[] args) throws QueryException{
        
/**
         * 修改?jin)配|文件用于测试hibernate整合spring是否正常
         
*/

        ApplicationContext context 
= new FileSystemXmlApplicationContext("src/applicationContext.xml"); 
        context.getBean(
"sessionFactory"); 
    
        StudentServer server 
= (StudentDAO) context.getBean("studentDAO"); 
        
        
/*        Student stu = new Student();
        stu.setStuname("qq22222222");
        stu.setAge(56);
        stu.setSex("?);
        stu.setPhone(555);
        //server.addStudentByCondition(stu);
        
        server.addStudent(stu);
*/

        List
<Student> list = server.getStudent("s""?/span>");
        
for(Student stu : list) 
            System.out.println(stu.getStuname());
        }

        
        
        
/**
         * 使用select  查询字段
         
        List<Object[]> list = server.getStudent("s", "?);
        for(Object[] c : list){
            for(Object a : c){
                System.out.print(a + "\t");
            }
            System.out.println();
        }
        
*/

    }

}


查询提供?jin)两U方式,一U是使用DAODelegate提供的查询(q和普通的hibernate一L(fng)Q?br /> W二U方式是 装?jin)一个查询类HqlQuery 具体使用例子中有?br />

Ҏ(gu)架提Z下几点:(x)
1、我现在xAbstractService  q个cdspring注入的时候设|成为静(rn)态的 可以提高效率 但不知会(x)有别的什么媄(jing)响?Q?q请哪个朋友指点一?十分感谢

2、StudentServer q个接口 和StudentDAOq个c?是一一对应?StudentDAOq个必须实现接口的方?而接口中定义和业务相关的方?StudentDAO在spring中注?调用时候用StudentServer 指向子类
但这L(fng)每在StudentServer 增加一个业务方法就要在dao实现cMd一?不知道这样好不好Q?
q请朋友们帮忙看?

3、因没有涉及(qing)到web开?但查询中~少分页查询Q正在整理,有好的分늻件请大家分n下我的邮?br /> sunxianchao@gmail.com

有什么好的徏议和提议请大家留a 十分感谢!!!

http://exs.mail.qq.com/cgi-bin/downloadfilepart?svrid=12&fid=644bd873e37da73f4ceeef5962b2eeae94fa6298069572c4
提取码:(x)20dc1eb4
希望可以提出(zhn)的宝贵意见

 



LifeNote 2007-12-10 13:41 发表评论
]]>
getHibernateTemplate() 学习(fn)的疑?/title><link>http://m.tkk7.com/lifenote/archive/2007/12/10/166573.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Mon, 10 Dec 2007 01:54:00 GMT</pubDate><guid>http://m.tkk7.com/lifenote/archive/2007/12/10/166573.html</guid><wfw:comment>http://m.tkk7.com/lifenote/comments/166573.html</wfw:comment><comments>http://m.tkk7.com/lifenote/archive/2007/12/10/166573.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/lifenote/comments/commentRss/166573.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lifenote/services/trackbacks/166573.html</trackback:ping><description><![CDATA[<p>         使用spring的HibernateTemplate q程中发现有很多Ҏ(gu)和直接用hibernate 查询的方法不?br /> 1、比如String hql = "select s from ShopInfo s where s.userId=:userid"; q个hql语句 使用hibernate查询<br /> Query query = this.getDaoDelegate().createQuery( hql ).setParameter("userid", userid);  q样得到一个query?可以通过setParameterҎ(gu)写对参数赋|可是通过HibernateTemplate  如何q行查询?br /> 2、用HibernateTemplate 的executeFind 和execute{方法的时候是q回一个HibernateCallback对象 要实现doInHibernateq个Ҏ(gu) q样查询的时候就都用了(jin)一个匿名函?br /> public List getAll(){<br />   return getHibernateTemplate().executeFind(new HibernateCallback() { <br />      public Object doInHibernate(Session s) { <br />         return s.createQuery("from Student").list(); <br />       } <br />     }); <br />  }<br /> 感觉q样很麻?有什么好的方法解决么 q请朋友多多指教 在线{?/p> <img src ="http://m.tkk7.com/lifenote/aggbug/166573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lifenote/" target="_blank">LifeNote</a> 2007-12-10 09:54 <a href="http://m.tkk7.com/lifenote/archive/2007/12/10/166573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring整合Hibernate 莫名其妙的错?http://m.tkk7.com/lifenote/archive/2007/12/07/165968.htmlLifeNoteLifeNoteFri, 07 Dec 2007 02:20:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/07/165968.htmlhttp://m.tkk7.com/lifenote/comments/165968.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/07/165968.html#Feedback11http://m.tkk7.com/lifenote/comments/commentRss/165968.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/165968.html
Hibernate: insert into test.student (STUNAME, AGE, SEX, PHONE) values (????)
java.lang.RuntimeException
    at com.stu.server.StudentServer.addStudentByCondition(StudentServer.java:
30)
    at com.stu.server.StudentServer$$FastClassByCGLIB$$8fef4d1a.invoke(
<generated>)
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:
149)
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:
696)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:
149)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:
106)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:
171)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:
631)
    at com.stu.server.StudentServer$$EnhancerByCGLIB$$f5f4d830.addStudentByCondition(
<generated>)
    at com.stu.test.Test.main(Test.java:
33)
Hibernate: update test.student set STUNAME
=?, AGE=?, SEX=?, PHONE=? where ID=?
q麻?ch)各位帮忙指点一?E序我上传上来了(jin)Q另外还请哪个大哥帮忙指?gu)E序的不之?

E序下蝲地址Q?a href="http://m.tkk7.com/Files/lifenote/HibernateInSpring.rar">http://m.tkk7.com/Files/lifenote/HibernateInSpring.rar

LifeNote 2007-12-07 10:20 发表评论
]]>
Hibernate中outer-join、lazy 、fetch join关键字的使用http://m.tkk7.com/lifenote/archive/2007/12/06/165782.htmlLifeNoteLifeNoteThu, 06 Dec 2007 05:31:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/06/165782.htmlhttp://m.tkk7.com/lifenote/comments/165782.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/06/165782.html#Feedback1http://m.tkk7.com/lifenote/comments/commentRss/165782.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/165782.html1、outer-join关键?many-to-one的情?

outer-join关键字有3个|分别是true,false,auto,默认是auto?br /> true: 表示使用外连接抓取关联的内容Q这里的意思是当用load(OrderLineItem.class,"id")ӞHibernate只生成一条SQL语句OrderLineItem与他的父亲Order全部初始化?br />
select * from OrderLineItem o left join Order p on o.OrderId=p.OrderId  where o.OrderLineItem_Id=?

false:表示不用外q接抓取兌的内容,当load(OrderLineItem.class,"id")ӞHibernate生成两条SQL语句Q一条查询OrderLineItem表,另一条查询Order表。这L(fng)好处是可以设|gq加载,此处要将Orderc设|ؓ(f)lazy=true?br />
select * from OrderLineItem o where o.OrderLineItem_Id=?
select * from Order p where p.OrderId=?

auto:具体是tureq是false?strong>hibernate.cfg.xml中的配置

注意Q如果用HQL查询OrderLineItemQ如 from OrderLineItem o where o.id='id'QL不用外部抓取,?qing)outer-join失效?br />

2、outer-join(集合)

׃集合可以讄lazy="true"Q所以lazy与outer-join不能同时为trueQ当lazy="true"Ӟouter-join一直是falseQ如果lazy="false"Q则outer-join用法??br />
3、HQL语句?x)将POJO配置文g中的兌一q查询,即在HQL语句中没有明?strong>join?/p>

4、In HQL, the "fetch join" clause can be used for per-query specific outer join fetching. One important thing many people miss there, is that HQL queries will ignore the outer-join attribute you specified in your mapping. This makes it possible to configure the default loading behaviour of session.load() and session.get() and of objects loaded by navigating relationship. So if you specify

and then do
MyObject obj = session.createQuery("from MyObject").uniqueResult();
obj.getMySet().iterator().next();

you will still have an additional query and no outer-join. So you must explicily request the outer-join fetching:

MyObject obj = session.createQuery(
"from MyObject mo left join fetch mo.mySet").uniqueResult();
obj.getMySet().iterator().next();

Another important thing to know is that you can only fetch one collection reference in a query. That means you can just use one fetch join. You can however fetch "one" references in addition, as this sample from the Hibernate Docs demonstrates:

from eg.Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens

We have once considered lifting this limitation, but then decided against it, because using more than one fetch-join would be a bad idea generally: The generated ResultSet becomes huge and is a major performance loss.

So alltogether the "fetch join" clause is an important instrument Hibernate users should learn how to leverage, as it allows tuning the fetch behaviour of a certain use case.

5?strong>join fetch ?join 的区?/p>

如果HQL使用?jin)连接,但是没有使?strong>fetch关键字,则生成的SQL语句虽然有连接,但是q没有取q接表的数据Q还是需要单独的sql取数据,也就?select a,b,d...中没有连接表的字D?/p>

6、如果集合被声明为lazy=trueQ在HQL中如果显式的使用 join fetch 则gq加载失效?/p>

7、在one-to-many的one端显式设|fecth="join",则无论如何都采取预先抓取Q生成一个SQlQ,延迟加蝲失效(生成两个SQL)

8、many-to-one的gq加载是在配|文件的class标签讄lazy="true",one-to-many和many-to- many的gq加载是在set标签中设|lazy="true"。而one-to-one不只要在calss标签讄lazy="true",而且要在 one-to-one标签中设|constrained="true".



LifeNote 2007-12-06 13:31 发表评论
]]>
վ֩ģ壺 ҹƷ| žѹۿȫƵ| 1000žžδʮ| 2020| þŷƷ| պƷר| ۺۺ| պƵ߹ۿ| ˳һ| һëƬƵ| Ļ޹˾þþƷ| ۺϼ޵һҳ | Ӱۿ| ޹˾þۺһ77| avɱվ| й߹ۿѹ| ޾Ʒҹ߹ۿ| 67194ֻѹۿ| ޿һ24޿| ɬɬѹۿƷ | ޹Ƭ߹ۿ| ˳Ƶ߲Ų| Ƶ| ؼëƬaaaaѹۿ| ޺ݺݰۺӰԺ| ŷһëƬѿ| һֻ| һѾƷƵ| ޹Ʒһž | 㻨ѸƵ| ޵һҳĻ| ֻˬֳƵ| ˳ѵӰ| ձƷѴȫ| ɫƷһ| ˬƵ| avһ| Ƶ69½| ŮƵƵȫѵ| ޾ƷƬ߹ۿ| Ůһһ鴤Ƶ |