??xml version="1.0" encoding="utf-8" standalone="yes"?>东凛在线观看,久久精彩视频,欧美性一区二区http://www.aygfsteel.com/zhangyy130/category/38678.html勤工好学Q地斚wL目标不能变!Q?/description>zh-cnMon, 30 Mar 2009 10:01:56 GMTMon, 30 Mar 2009 10:01:56 GMT60inverse ?cascade 的区?/title><link>http://www.aygfsteel.com/zhangyy130/archive/2009/03/30/262921.html</link><dc:creator>张永耀</dc:creator><author>张永耀</author><pubDate>Mon, 30 Mar 2009 08:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/zhangyy130/archive/2009/03/30/262921.html</guid><wfw:comment>http://www.aygfsteel.com/zhangyy130/comments/262921.html</wfw:comment><comments>http://www.aygfsteel.com/zhangyy130/archive/2009/03/30/262921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zhangyy130/comments/commentRss/262921.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zhangyy130/services/trackbacks/262921.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed"> <tbody> <tr> <td> <div id="wmqeeuq" class="cnt" id="blog_text"> <p><font color="#ff0000">1.作用的范围不同:</font></p> <p>1Qinverse Q?lt;set/>,<map/>,<list/>,<array/>,<bag/></p> <p>2Qcascade Q?lt;many-to-one>,<one-to-one/>,<set/>,<map/>,<list/>,<array/>,<bag/>.</p> <p><font color="#ff0000">2.执行{略不同</font></p> <p>1Qinverse Q首先判断集合的变化情况Q然后针对变化执行相应的处理?/p> <p>2Qcascade Q直接对集合中的每个元素执行相应的处理?/p> <p><font color="#ff0000">3.执行的时Z?/font></p> <p>1Qinverse Q在执行SQL语句之前判断是否要执行该SQL语句?/p> <p>2Qcascade Q在L方发生操作时用来判断是否q行U联操作?/p> <p><font color="#ff0000">4.执行的目标不?/font></p> <p>1Qinverse Q对?lt;one-to-many>处理被管理表Q?lt;many-to-many/>处理中间表?/p> <p>2Qcascade Q都只只对被兌表?/p> <p>ȝQ书上说了inverse 一对多的时候最好把多的一方设|成false׃的一Ҏ控制Qcascade量别Q进行显C的d删除?/p> </div> </td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/zhangyy130/aggbug/262921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zhangyy130/" target="_blank">张永耀</a> 2009-03-30 16:46 <a href="http://www.aygfsteel.com/zhangyy130/archive/2009/03/30/262921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(zt) 高配置及机?hibernatehttp://www.aygfsteel.com/zhangyy130/archive/2009/03/30/262904.html张永耀张永耀Mon, 30 Mar 2009 08:06:00 GMThttp://www.aygfsteel.com/zhangyy130/archive/2009/03/30/262904.htmlhttp://www.aygfsteel.com/zhangyy130/comments/262904.htmlhttp://www.aygfsteel.com/zhangyy130/archive/2009/03/30/262904.html#Feedback0http://www.aygfsteel.com/zhangyy130/comments/commentRss/262904.htmlhttp://www.aygfsteel.com/zhangyy130/services/trackbacks/262904.html构造这样一个例子,在测试过E中来说明一些Hibernate的高U配|及其相xӞ
有三个类QCategory.java,Prodcuct.java,ConfigurationTest.javaQ其中第三个cL用来试的?br /> Category.java代码Q?
       

package unsaved_value;    
import ......    
public class Category {    
    private Integer id;    
    private String name;    
    private String description;    
    private Set products;    
    public Category(){    
         id=null;    
         name=null;    
        description=null;    
        products=new HashSet ();    
     }    
     public void addProduct(Product p){    
         products.add(p);    
    }    
     //**********setter and getter    
    ........    
}   


Product.java代码Q?/p>


package unsaved_value;      
public class Product {      
    private Integer id;      
    private String name;      
    private Category category;      
    private String description;      
    public Product(){     
         
    }      
     //*******getter and setter      
     .........      
}      

ConfigurationTest.java

public void testSave()throws Exception{    
        Category category=new Category();    
        category.setName("java~程书籍2");    
        category.setDescription("~程l典书籍2");    
        Product pro=new Product();    
        pro.setName("java~程思想2");    
        pro.setDescription("W四版中文版2");     
        pro.setCategory(category);    
        category.addProduct(pro);    
        Transaction tx=session.beginTransaction();    
        assert (session!=null):("session is null");    
        session.save(category);    
        tx.commit();    
    }    

     
Category代表产品目录Q而Product代表产品Q显然Category与Product是一对多的关pRHibernate在映一对多关系Ӟ有两U方式,一U是单向一对多Q一U是双向关系。两者相比,双向一对多的好处体现在两方面:首先Q也是很明显的一点,׃是双向关联,我们在实际业务逻辑时将更方便,例如我们可以索一个Category下的所有ProductQ同时还可以索出Product属于哪个。其ơ,双向关系相对单向关系而言Q在数据库的讉K斚w更有优势。这一点留在后面讲inverse时讲
。双向关联比单向兌唯一?#8221;劣势“Q就在于双向兌需要比单向兌多写一个映文Ӟq不问题。用双向关联实现这两个cd数据库的映射Q?

Category.hbm.xml:  
version="1.0" encoding="UTF-8"?>  

" <hibernate-mapping package="unsaved_value">  
   <class name="Category" table="category">  
     <id name="id" column="id">  
       <generator class="native">generator>  
     id>  
     
     <property name="name" column="name"/>  
     <property name="description" column="description"/>


     <set name="products" table="product" lazy="true" inverse="true" cascade="all">  
         <key column="category"/>  
            <one-to-many class="Product"/>  
     set>  
     
   class>  
hibernate-mapping>  
  
Product.hbm.xml:


version="1.0" encoding="UTF-8"?>    
"
<hibernate-mapping package="unsaved_value">    
<class name="Product" table="product">    
     <id name="id" column="id" unsaved-value="null">    
         <generator class="native">generator>    
     id>    
         
     <property name="name" column="name"/>    
     <property name="description" column="description"/>    
       
     <many-to-one name="category"    
                  column="category"     
                  class="Category"    
     />    
   class>    
hibernate-mapping>    
        
现在把这个例子所牉|到的知识一一展开Q?br /> 一.inverse
    该词的译意是“反{”,反{什么——反转控制端Q这w|决定了由关联双方中的哪一Ҏl持兌关系Q在数据库中表现为外键约束)。上q配|中Q在Category.hbm.xml中将inverse讄为true,意思是?#8220;我需要反转(控制端)”Q反转的l果是由Ҏ即Product来维持关联关pR用单向兌更容易说?#8221;l持兌关系“是什么意思:考虑用单向关pL实现q个映射关系的情况,即由Category兌到ProductQ考虑下面的代码:

Product p=new Product();  
..setXXX  
Category c=new Category();  
..讄Category的属?nbsp; 
c.addProduct(p);//建立起了c和p的关联关p?nbsp; 
session.save(c);  

会执行三条SQL语句:两条插入语句Q分别插入c和pQ然后还有一条update语句建立起c和p的关联(更新p的外键)。上面,我们说由Category端控制关联,因此p.setCategory(c)q样一句话是没用的,它ƈ不会D在插入p的时候就讄p的外键以建立起两者的兌关系Q从而节省一条update语句。同时我们还会看刎ͼ如果在数据库模式中将p的外键设|成非空Q这些代码将不能执行Q因为在插入pӞ׃c和p的关联关p还未徏立v来,因此p的外键ؓI。回到双向关联上来,Z更清楚地明白inverse在双向关联中到底起什么作用,我们分别其D为true和false,看看打印出的的SQL有何区别Q?/p>

inverse=true时的打印l果Q?br />
Hibernate: insert into category (name, description) values (?, ?)  
Hibernate: insert into product (name, description, category) values (?, ?, ?)   
inverse=false时的打印l果Q?br />
Hibernate: insert into category (name, description) values (?, ?)    
Hibernate: insert into product (name, description, category) values (?, ?, ?)    
Hibernate: update product set category=? where id=?   
       Z么inverse=true时会比inverse=false时少执行一条SQL语句Q这是由控制端的不同造成的。前者说"我要反{控制Q由Product来控制关?Q因此在p对象insertӞp已经讄了其category字段Q从而徏立了兌关系Q而后者说"我不反{控制Q由我自己来控制兌",因此在将p对象insert后,cZl持两者的兌Q还要去执行一ơupdateQ以更新p的外键,从而徏立v两者的兌关系?br /> l论Q对于一对多双向关系Q始l在“一”那一方将其inverse讄成true,q样会提高性能?/p>

?cascade
   U联。当兌?一"方进行某U动作(更新Q删除)Ӟ"?方即使没有显式地q行~码Q它也会自动q行同样的动作。cascade的可选值有Q?br /> all : 所有情况下均进行关联操作。即是save-update + delete
noneQ所有情况下均不q行兌操作。这是默认倹{?br /> save-update:在执行save/update/saveOrUpdate时进行关联操作?br /> deleteQ在执行delete时进行关联操作?br /> all-delete-orphan:A:U联save-update BU联delete C:删除所有孤儉KQorphan孤儿Q。先看看父子关系Q例如在Customer和Order的模型中Q这两者便是父子关p,当一个Customer的生命周期决定Order的生命周期,如果一个Customer不在了,其相关的Orderl箋存在是毫无业务意义的。删除所有孤儉K的意思即是,删除所有与父对象失d联关pȝ子对象?/p>

?lazy
    是否延迟加蝲。一般来_应该延迟加蝲Q即lazy设ؓtrue。gq加载的相关点很多,q在另外的学习笔Cȝ?/p>

?unsaved-value
    以上?一"方的重要配置Q再看看"?方的一个重要配|?unsaved-value,像上面Product.hbm.xml中的讄那样Q这一在id的配|中讄。这一讄是与U联一起工作的。关于这一点,robbin讲的很清楚:
当你昑ּ的用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value 的。某些情况下(父子表关联保?Q当你在E序中ƈ没有昑ּ的用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已l持久化q的持久对象Q是一个尚未被持久化过的内存时对象。例如:
       Session session = ...;
Transaction tx = ...;  
Parent parent = (Parent) session.load(Parent.class, id);  
Child child = new Child();  
child.setParent(parent);  
child.setName("sun");  
parent.addChild(child);  
s.update(parent);  
s.flush();  
tx.commit();  
s.close();  
     在上例中Q程序ƈ没有昑ּ的session.save(child); 那么Hibernate需要知道childI竟是一个时对象,q是已经在数据库中有的持久对象。如果child是一个新创徏的时对?本例中就是这U情?Q那么Hibernate应该自动产生session.save(child)q样的操作,如果child是已l在数据库中有的持久对象Q那?Hibernate应该自动产生session.update(child)q样的操作。因此我们需要暗CZ下HibernateQ究?child对象应该对它自动saveq是update。在上例中,昄我们应该暗示Hibernate对child自动saveQ而不是自?update。那么Hibernate如何判断I竟对child是saveq是update呢?它会取一下child的主键属?child.getId() Q这里假设id?java.lang.Integercd的。如果取到的Id值和hbm映射文g中指定的unsave-value相等Q那么Hibernate认ؓ child是新的内存时对象,发送saveQ如果不相等Q那么Hibernate认ؓchild是已l持久过的对象,发送update。unsaved-value="null" (默认情况Q适用于大多数对象cd主键 Integer/Long/String/...)
当Hibernate取一下child的IdQ取出来的是null(在上例中肯定取出来的是null)Q和unsaved-value讑֮值相{,发送save(child)
当Hibernate取一下child的idQ取出来的不是nullQ那么和unsaved-value讑֮g相等Q发送update(child)
   unsaved-value的可选配|有Q?br /> noneQanyQnull
unsaved-value="none"和unsaved-value="any"主要用在主键属性不是通过Hibernate生成Q而是E序自己setId()的时候。unsaved-value="none"和unsaved-value="any"I竟有什么含义了。如果你非要用assigned不可Q那么l解释一下:
unsaved-value="none" 的时候,׃不论主键属性ؓM|都不可能为noneQ因此HibernateL对child对象发送update(child)
unsaved-value="any" 的时候,׃不论主键属性ؓM|都肯定ؓanyQ因此HibernateL对child对象发送save(child)
      大多数情况下Q可以避免用assignedQ只有当你用复合主键的时候不得不手工setId()Q这时候需要你自己考虑I竟怎么讄unsaved-value了,Ҏ你自q需要来定?br />       关于Z么不要主键带有义务意义Qrobbin的解释很清楚Q还是以上面的例子打比方Q如果我们将Category的某一个性质Q比如品序h者名Uͼ作ؓ主键Q如果后来由于业务需要,我们把这个性质改了Q那不可僻免地要去修改与这个对象相兌的所有数据的外键Q而如果我们只要代理主键,q个问题可完全d?/p>

张永耀 2009-03-30 16:06 发表评论
]]>
ResultSet can not re-read row data for column 问题http://www.aygfsteel.com/zhangyy130/archive/2009/03/27/262415.html张永耀张永耀Fri, 27 Mar 2009 06:25:00 GMThttp://www.aygfsteel.com/zhangyy130/archive/2009/03/27/262415.htmlhttp://www.aygfsteel.com/zhangyy130/comments/262415.htmlhttp://www.aygfsteel.com/zhangyy130/archive/2009/03/27/262415.html#Feedback0http://www.aygfsteel.com/zhangyy130/comments/commentRss/262415.htmlhttp://www.aygfsteel.com/zhangyy130/services/trackbacks/262415.html

张永耀 2009-03-27 14:25 发表评论
]]>
վ֩ģ壺 | | | | ƽ| ͨ| Ʊ| Դ| | ɳ| | µ| | | ʡ| ޳| | «ɽ| | | | | | | ӳ| | ³| | | | | | | | | | | | Ϫ| ͬ| ͬ|