`

一对多/多对一 cascade属性 inverse属性 随记

阅读更多
基本配置操作:http://yafei.iteye.com/blog/799999
inverse属性:http://www.iteye.com/topic/2633
inverse属性及hibernate其它知识(易理解):http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=3479
	<class name="org.onetomany.bo.Child" table="CHILD">    
                <id name="id" column="ID" type="integer">    
                    <generator class="sequence">
						<param name="sequence">SEQ_ID</param>
					</generator>    
                </id>    
        <many-to-one name="parent" class="org.onetomany.bo.Parent" cascade="save-update"  column="PARENTID"/>    
    </class>    
    <class name="org.onetomany.bo.Parent" table="PARENT">    
                <id name="parentId" column="PARENTID" type="integer">    
                    <generator class="sequence">
						<param name="sequence">SEQ_PAERENTID</param>
					</generator>      
                </id>    
        <bag name="child"  inverse="true" cascade="all">    
             <key column="PARENTID"/>    
             <one-to-many class="org.onetomany.bo.Child"/>    
        </bag>    
    </class> 


		Session s=null;
		Transaction tx=null;
		try{
			s=HibernateSessionFactory.getSession();
			tx=s.beginTransaction();    //hibernate的事务默认是关闭的,我们必须把他打开。
			
			Parent parent = new Parent();
            Child child = new Child();  
            Child child2 = new Child();  
            Child child3 = new Child();  
            List list = new ArrayList();    
            list.add(child);   
            list.add(child2);
            list.add(child3);
            parent.setChild(list);   
            System.out.println("dddddddddddddddddddddddddddddddddddddddddddddddddddddd");  
            
            child.setParent(parent);
            child2.setParent(parent);
            child3.setParent(parent);   
            s.save(child);;    
            s.flush();;    
            System.out.println("llllllllllllllllllllllllllll");   
			tx.commit();
		}catch(HibernateException e){
			if(tx!=null){
				tx.rollback();
			}
			throw e;
		}finally{
			if(s!=null){
				s.close();
			}
		}

cascade属性: 
去掉parent里的cascade="all"

Hibernate: select SEQ_PAERENTID.nextval from dual
Hibernate: insert into PARENT (PARENTID) values (?)
dddddddddddddddddddddddddddddddddddddddddddddddddddddd
Hibernate: select SEQ_ID.nextval from dual
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
ID          PARENTID   
----------- -----------   
         74           19  

不不去掉parent里的[color=red]cascade="all"

dddddddddddddddddddddddddddddddddddddddddddddddddddddd
Hibernate: select SEQ_ID.nextval from dual
Hibernate: select SEQ_PAERENTID.nextval from dual
Hibernate: select SEQ_ID.nextval from dual
Hibernate: select SEQ_ID.nextval from dual
Hibernate: insert into PARENT (PARENTID) values (?)
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
llllllllllllllllllllllllllll
ID          PARENTID   
----------- -----------   
         74           19   
         75           19  
         76           19

去掉parent里的[color=red]inverse="true" 属性
dddddddddddddddddddddddddddddddddddddddddddddddddddddd
Hibernate: select SEQ_ID.nextval from dual
Hibernate: select SEQ_PAERENTID.nextval from dual
Hibernate: select SEQ_ID.nextval from dual
Hibernate: select SEQ_ID.nextval from dual
Hibernate: insert into PARENT (PARENTID) values (?)
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
Hibernate: update CHILD set PARENTID=? where ID=?
Hibernate: update CHILD set PARENTID=? where ID=?
Hibernate: update CHILD set PARENTID=? where ID=?
llllllllllllllllllllllllllll
ID          PARENTID   
----------- -----------   
         74           19   
         75           19  
         76           19

多了三次update ,存在性能问题

改成如下代码:
Session s=null;
		Transaction tx=null;
		try{
			s=HibernateSessionFactory.getSession();
			tx=s.beginTransaction();    //hibernate的事务默认是关闭的,我们必须把他打开。
			
			Parent parent = new Parent();;    
            Child child = new Child();;    
            Child child2 = new Child();;    
            List list = new ArrayList();;    
            list.add(child);;    
            list.add(child2);;    
            parent.setChild(list);;    
            s.save(parent);;    
            s.flush();;    
            System.out.println("dddddddddddddddddddddddddddddddddddddddddddddddddddddd"); ;    
            Child child3 = new Child();;  
            child3.setParent(parent);;  
//            child.setParent(parent);
//            child2.setParent(parent);
            s.save(child3);;  
//            s.save(child);;
//            s.save(child2);;
            System.out.println("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"); ;    
			tx.commit();
		}catch(HibernateException e){
			if(tx!=null){
				tx.rollback();
			}
			throw e;
		}finally{
			if(s!=null){
				s.close();
			}
		}	


去掉parent里的[color=red]inverse="true" 属性
Hibernate: select SEQ_PAERENTID.nextval from dual
Hibernate: select SEQ_ID.nextval from dual
Hibernate: select SEQ_ID.nextval from dual
Hibernate: insert into PARENT (PARENTID) values (?)
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
Hibernate: update CHILD set PARENTID=? where ID=?
Hibernate: update CHILD set PARENTID=? where ID=?
dddddddddddddddddddddddddddddddddddddddddddddddddddddd
Hibernate: select SEQ_ID.nextval from dual
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
ID          PARENTID   
----------- -----------   
         74           19   
         75           19  
         76           19


不去掉parent里的[color=red]inverse="true" 属性
Hibernate: select SEQ_PAERENTID.nextval from dual
Hibernate: select SEQ_ID.nextval from dual
Hibernate: select SEQ_ID.nextval from dual
Hibernate: insert into PARENT (PARENTID) values (?)
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)
dddddddddddddddddddddddddddddddddddddddddddddddddddddd
Hibernate: select SEQ_ID.nextval from dual
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Hibernate: insert into CHILD (PARENTID, ID) values (?, ?)

ID          PARENTID   
----------- -----------   
         74           -   
         75           -  
         76           19

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics